diff --git a/lib/apis.js b/lib/apis.js index e229cdce7ed014aaa9acaf51cfe6b8c4a2d09de1..9e2a783249c08c02cd6231da9a31dbdd6e262bdc 100644 --- a/lib/apis.js +++ b/lib/apis.js @@ -131,6 +131,7 @@ const device = [ const keyboard = [ 'hideKeyboard', 'onKeyboardHeightChange', + 'offKeyboardHeightChange', 'getSelectedTextRange' ] diff --git a/lib/modules.json b/lib/modules.json index a4d1d6dfa8d282e20e2e9da2d432a44cc01477e4..ef5153b6b1d51c2e717aa130d5bee5a611ed58cc 100644 --- a/lib/modules.json +++ b/lib/modules.json @@ -162,7 +162,8 @@ "uni.createIntersectionObserver": true, "uni.createMediaQueryObserver": true, "uni.hideKeyboard": true, - "uni.onKeyboardHeightChange": true + "uni.onKeyboardHeightChange": true, + "uni.offKeyboardHeightChange": true } }, { "name": "event", diff --git a/src/core/helpers/api.js b/src/core/helpers/api.js index 6d2b15524be43748c51709216f7bfa150c02292f..22bffff77dcd625ea15ddb9af1e716a6eeda6caf 100644 --- a/src/core/helpers/api.js +++ b/src/core/helpers/api.js @@ -275,6 +275,10 @@ export function invokeCallbackHandler (invokeCallbackId, res, extras) { return res } +export function removeCallbackHandler (invokeCallbackId) { + delete invokeCallbacks[invokeCallbackId] +} + export function wrapperUnimplemented (name) { return function todo (args) { console.error('API `' + name + '` is not yet implemented') diff --git a/src/core/service/api/keyboard/keyboard.js b/src/core/service/api/keyboard/keyboard.js index d4f17e42e93483eef58e3a9d973a8f57f738761f..0b5306f7326573bf2ed89b357abc1cd768e6f52f 100644 --- a/src/core/service/api/keyboard/keyboard.js +++ b/src/core/service/api/keyboard/keyboard.js @@ -1,5 +1,6 @@ import { - invoke + invoke, + remove } from 'uni-core/service/bridge' import { @@ -15,5 +16,12 @@ onMethod('onKeyboardHeightChange', res => { }) export function onKeyboardHeightChange (callbackId) { + // 与微信小程序一致仅保留最后一次监听 + remove(callback) callback = callbackId } + +export function offKeyboardHeightChange () { + // 与微信小程序一致移除最后一次监听 + callback = null +} diff --git a/src/core/service/bridge.js b/src/core/service/bridge.js index 9160f7844d3e6f3d3d018af221912d0759d363ef..12db7f9c549dfe55fa5ea4811603a27e2f7e6018 100644 --- a/src/core/service/bridge.js +++ b/src/core/service/bridge.js @@ -1,11 +1,15 @@ export function pack (args) { return args -} - +} + export function unpack (args) { return args } export function invoke (...args) { return UniServiceJSBridge.invokeCallbackHandler(...args) +} + +export function remove (args) { + return UniServiceJSBridge.removeCallbackHandler(args) } diff --git a/src/core/service/bridge/index.js b/src/core/service/bridge/index.js index 2eae012ead38cd546683f02c3e8e9e51b46d9648..42da4f5106829699171599e9b2337339c2449855 100644 --- a/src/core/service/bridge/index.js +++ b/src/core/service/bridge/index.js @@ -8,7 +8,8 @@ export const once = Emitter.$once.bind(Emitter) export const emit = Emitter.$emit.bind(Emitter) export { - invokeCallbackHandler + invokeCallbackHandler, + removeCallbackHandler } from 'uni-helpers/api' @@ -30,4 +31,4 @@ export function subscribeHandler (event, args, pageId) { export { publishHandler } - from 'uni-platform/service/bridge' + from 'uni-platform/service/bridge' diff --git a/src/platforms/app-plus/service/index.js b/src/platforms/app-plus/service/index.js index 2599290992e72723dfa2dec8c453bb754bfbf544..9f6eada37521a653436372867d8e15a7a0430fbd 100644 --- a/src/platforms/app-plus/service/index.js +++ b/src/platforms/app-plus/service/index.js @@ -3,7 +3,8 @@ import { } from 'uni-core/service/uni' import { - invokeCallbackHandler + invokeCallbackHandler, + removeCallbackHandler } from 'uni-helpers/api' import { @@ -35,6 +36,7 @@ uni.__$wx__ = wx UniServiceJSBridge.publishHandler = publishHandler UniServiceJSBridge.invokeCallbackHandler = invokeCallbackHandler +UniServiceJSBridge.removeCallbackHandler = removeCallbackHandler export default { __vuePlugin: vuePlugin, @@ -44,4 +46,4 @@ export default { uni, getApp, getCurrentPages -} +}