diff --git a/README.md b/README.md index c5947bd..26b5b92 100644 --- a/README.md +++ b/README.md @@ -51,16 +51,42 @@ bridge.share( ); ``` -### 监听来自 Flutter 的消息 +### 监听来自 Flutter 的消息 (支持一对多监听) + +现在 `FlutterBridge.instance.on` 支持注册多个监听器,并且 `on` 方法会返回一个 `VoidCallback` 函数,调用该函数可以精确取消本次注册的监听。此外,新增了 `once` 方法用于一次性监听。 ```dart -// 注册监听器 -FlutterBridge.instance.on(FromFlutterAppEnum.translateResult.code, (data) { - print("收到翻译结果: ${data['data']}"); - // 处理翻译结果 -}); +// 注册监听器 (一对多) +// on 方法返回一个用于取消当前监听的函数 +final cancelTranslationListener = FlutterBridge.instance.on( + FromFlutterAppEnum.translateResult.code, + (data) { + print("收到翻译结果: ${data['data']}"); + // 处理翻译结果 + }, +); +// 当不再需要某个监听时,调用其返回的函数来精确取消 +cancelTranslationListener.call();; +// 注册另一个监听器 +final anotherListener = FlutterBridge.instance.on( + FromFlutterAppEnum.translateResult.code, + (data) { + print("另一个监听器收到翻译结果: ${data['data']}"); + }, +); +// 当不再需要某个监听时,调用其返回的函数来精确取消 +cancelTranslationListener.call();; -// 使用完毕后记得取消监听 +// 仅监听一次 (一次性监听,不用手动取消,调用一次后自动取消) +FlutterBridge.instance.once( + FromFlutterAppEnum.shareFinished.code, + (data) { + print("分享完成 (一次性监听): $data"); + }, +); + +// 如果需要移除某个类型的所有监听器,可以使用 off 方法 +// 警告:这将移除 FromFlutterAppEnum.translateResult.code 对应的所有监听器 FlutterBridge.instance.off(FromFlutterAppEnum.translateResult.code); ``` @@ -80,24 +106,52 @@ final bridge = FlutterBridge.instance; ##### `on(String type, Function(Map) callback)` -注册一个消息监听器。 +注册一个消息监听器。现在支持为同一 `type` 注册多个监听器。 + +- `type`: 消息类型(使用 `FromFlutterAppEnum` 中的 code) +- `callback`: 回调函数,接收消息数据 + +**返回** `VoidCallback`: 调用此函数可以精确地移除当前注册的这个监听器。 + +```dart +// 注册第一个监听器 +final cancelListener1 = bridge.on(FromFlutterAppEnum.translateResult.code, (data) { + print("监听器1收到翻译结果: ${data['data']}"); +}); + +// 注册第二个监听器 +final cancelListener2 = bridge.on(FromFlutterAppEnum.translateResult.code, (data) { + print("监听器2收到翻译结果: ${data['data']}"); +}); + +// 当不再需要第一个监听器时,调用其返回的函数 +cancelListener1.call();// 仅移除监听器1 +``` + +##### `off(String type)` + +##### `once(String type, Function(Map) callback)` + +注册一个【一次性】消息监听器。该监听器在收到消息后会自动移除。 - `type`: 消息类型(使用 `FromFlutterAppEnum` 中的 code) - `callback`: 回调函数,接收消息数据 ```dart -bridge.on(FromFlutterAppEnum.translateResult.code, (data) { - // 处理消息 +bridge.once(FromFlutterAppEnum.shareFinished.code, (data) { + print("收到分享完成事件: $data"); + // 处理一次性逻辑 }); ``` ##### `off(String type)` -取消注册消息监听器。 +取消注册某个 `type` 的【所有】消息监听器。此方法主要用于兼容旧代码或需要一次性清空所有同类型监听的场景。 -- `type`: 要取消监听的消息类型 +- `type`: 要取消监听的【所有】消息类型 ```dart +// 警告:这将移除 FromFlutterAppEnum.translateResult.code 对应的所有监听器 bridge.off(FromFlutterAppEnum.translateResult.code); ``` @@ -277,8 +331,8 @@ import 'package:web_tools/web_tools.dart'; void setupTranslation() { final bridge = FlutterBridge.instance; - // 注册翻译结果监听器 - bridge.on(FromFlutterAppEnum.translateResult.code, (data) { + // 注册翻译结果监听器(once不用手动清理,内部自动清理监听) + bridge.once(FromFlutterAppEnum.translateResult.code, (data) { final translatedText = data['data']['text']; print('翻译结果: $translatedText'); // 更新 UI 显示翻译结果 @@ -292,10 +346,6 @@ void setupTranslation() { }); } -void cleanup() { - // 清理监听器 - FlutterBridge.instance.off(FromFlutterAppEnum.translateResult.code); -} ``` ### 完整示例:分享功能 @@ -325,7 +375,7 @@ void setupShare() { 1. **单例模式**:`FlutterBridge` 使用单例模式,在整个应用中只有一个实例。 -2. **监听器管理**:使用 `on()` 注册的监听器在使用完毕后应该使用 `off()` 取消注册,避免内存泄漏。 +2. **监听器管理**:使用 `on()` 注册的监听器在使用完毕后应该使用`_listener1.call()` 取消注册,避免内存泄漏, `off()` 这将移除对应type的所有监听器。`once()`方法不用手动取消监听,内部自动清理监听。 3. **消息格式**:所有消息都遵循 `{'type': '消息类型', 'data': {...}}` 的格式。