diff --git a/packages/unify_uni_api/CHANGELOG.md b/packages/unify_uni_api/CHANGELOG.md index c3b42bb..c8a6bdb 100644 --- a/packages/unify_uni_api/CHANGELOG.md +++ b/packages/unify_uni_api/CHANGELOG.md @@ -1,3 +1,9 @@ +## 3.0.6 + +* feat: 在 UniFlutterModule 模式(native -> dart),新增 API 修饰注解 `@UniBufferSize(n)`,用于为指定方法对应的 platform channel 扩大消息缓冲区(默认容量为 1)。可解决原生在 Dart 侧 handler 注册前连续发消息时,早到消息被丢弃的问题。生成的原生 `setup` 会在建立 channel 时调用 `resizeChannelBuffer`(iOS)/`resizeChannelBuffer`(Android)。未标注的方法保持原有逻辑不变;`n` 必须为正整数字面量,非法值将告警并忽略;与 `@RequiredMessager` 同时标注时忽略并告警(目标 messenger 由每次调用决定)。 +* fix: [iOS] UniAPI 生成的 OC 接口,基础类型(int/double/bool)统一装箱为 NSNumber*,与 Dart 声明类型不一致;改为映射为原生标量(NSInteger/double/BOOL)使参数与返回值类型对齐声明,可空类型及集合泛型实参位置仍回退 NSNumber*。同步修复 UniNativeModule / UniFlutterModule / UniCallback 三条通道中标量装箱/拆箱的胶水代码。 +* fix: [iOS] 承接上条标量映射改动,修复 UniFlutterModule 回调路径的 ARC 报错:`UniCompleted` 回调形参为 `id`,而非空标量返回值被拆箱成 `NSInteger`/`BOOL`/`double` 后直接传入,触发 "Implicit conversion ... to 'id' is disallowed with ARC"。改为在目标为 `id` 时不拆箱,沿用 channel 传来的 NSNumber。 + ## 3.0.5 * fix: Flutter 与原生侧 UNICallback 的 key 名称不一致导致,UNICallback析构事件获取名称时 null,引发异常 diff --git a/packages/unify_uni_api/README.md b/packages/unify_uni_api/README.md index ed6344b..d29f788 100644 --- a/packages/unify_uni_api/README.md +++ b/packages/unify_uni_api/README.md @@ -212,6 +212,30 @@ Through this example, we experienced the value brought by Unify: 3. Automatic generation of a large number of channels, easy to maintain 4. Seamless serialization of complex entities, reducing management costs +## Advanced: Enlarging the Channel Buffer (`@UniBufferSize`) + +In `@UniFlutterModule` mode (native -> dart), each platform channel keeps only **1** buffered message by default. If the native side sends messages *before* the Dart-side handler is registered (a common race during startup), earlier messages are silently dropped — e.g. calling a native->flutter method twice in a row may lose the first callback. + +Annotate the method with `@UniBufferSize(n)` to enlarge that channel's buffer to `n`, so early messages are queued instead of discarded: + +```dart +@UniFlutterModule() +abstract class LocationInfoService { + /// Enlarge this channel's buffer to 100. + @UniBufferSize(100) + void updateLocationInfo(LocationInfoModel model); +} +``` + +The generated native `setup` will size the buffer when the channel is created (iOS `resizeChannelBuffer:` / Android `resizeChannelBuffer(int)`). + +Notes: + +- Only effective in `@UniFlutterModule` mode (native -> dart). +- `n` must be a positive integer literal; invalid values are ignored with a warning. +- Methods without the annotation keep the original behavior unchanged (no code is generated). +- Ignored (with a warning) when combined with `@RequiredMessager`, since that method's target messenger is decided per call rather than at `setup` time. + ## Decision Tree We have summarized the following decision-making process: diff --git a/packages/unify_uni_api/README.zh-CN.md b/packages/unify_uni_api/README.zh-CN.md index 150847d..5874941 100644 --- a/packages/unify_uni_api/README.zh-CN.md +++ b/packages/unify_uni_api/README.zh-CN.md @@ -212,6 +212,30 @@ OutlinedButton( 3. 大量 Channel 自动生成,易于维护 4. 复杂实体无缝序列化,降低管理成本 +## 进阶:扩大 Channel 缓冲区(`@UniBufferSize`) + +在 `@UniFlutterModule` 模式(native -> dart)下,每条 platform channel 默认只缓存 **1** 条消息。如果原生侧在 Dart 侧 handler 注册**之前**就发送消息(启动阶段常见的时序竞争),早到的消息会被静默丢弃 —— 例如连续两次调用某个 native->flutter 方法,可能丢掉第一次的回调。 + +给方法标注 `@UniBufferSize(n)`,即可将该 channel 的缓冲区扩大到 `n`,让早到消息进入队列而不是被丢弃: + +```dart +@UniFlutterModule() +abstract class LocationInfoService { + /// 将该 channel 的缓冲区扩大到 100。 + @UniBufferSize(100) + void updateLocationInfo(LocationInfoModel model); +} +``` + +生成的原生 `setup` 会在创建 channel 时设置缓冲区大小(iOS `resizeChannelBuffer:` / Android `resizeChannelBuffer(int)`)。 + +说明: + +- 仅在 `@UniFlutterModule` 模式(native -> dart)下生效。 +- `n` 必须为正整数字面量;非法值会告警并忽略。 +- 未标注的方法保持原有逻辑不变(不生成任何代码)。 +- 与 `@RequiredMessager` 同时标注时忽略并告警,因为该方法的目标 messenger 由每次调用决定,而非在 `setup` 时确定。 + ## Decision Tree 我们总结了如下决策流程: diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoModel.java b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoModel.java index 543ce23..ca331af 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoModel.java +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoModel.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.uninativemodule_demo; @@ -17,6 +17,8 @@ public class DeviceInfoModel extends UniModel { private String osVersion; // 系统版本 private String memory; // 内存信息 private String plaform; // 手机型号 + private long test; + private boolean test2; public String getOsVersion() { return osVersion; } @@ -30,6 +32,14 @@ public class DeviceInfoModel extends UniModel { public void setPlaform(String plaform) { this.plaform = plaform; } + public long getTest() { return test; } + + public void setTest(long test) { this.test = test; } + + public boolean getTest2() { return test2; } + + public void setTest2(boolean test2) { this.test2 = test2; } + @Override public Map toMap() { @@ -37,6 +47,8 @@ public Map toMap() { result.put("osVersion", osVersion); result.put("memory", memory); result.put("plaform", plaform); + result.put("test", test); + result.put("test2", test2); return result; } @@ -45,6 +57,8 @@ public static DeviceInfoModel fromMap(Map map) { result.osVersion = map.containsKey("osVersion") && map.get("osVersion") != null ? (String) map.get("osVersion") : ""; result.memory = map.containsKey("memory") && map.get("memory") != null ? (String) map.get("memory") : ""; result.plaform = map.containsKey("plaform") && map.get("plaform") != null ? (String) map.get("plaform") : ""; + result.test = map.containsKey("test") && map.get("test") != null ? ((Number) map.get("test")).longValue() : 0; + result.test2 = map.containsKey("test2") && map.get("test2") != null ? (Boolean) map.get("test2") : false; return result; } diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoService.java b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoService.java index 846dce9..cbcdb16 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoService.java +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoService.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.uninativemodule_demo; @@ -27,4 +27,14 @@ interface Result { */ void getDeviceInfo(Result result); + long test(boolean st); + + boolean test2(double st); + + String test3(long st); + + long test4(long st); + + void test5(Map st, Result result); + } diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoServiceRegister.java b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoServiceRegister.java index 6200208..637252b 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoServiceRegister.java +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/DeviceInfoServiceRegister.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.uninativemodule_demo; @@ -85,7 +85,137 @@ public static void setup(BinaryMessenger binaryMessenger, DeviceInfoService impl Map params = (Map) message; impl.getDeviceInfo((ret) -> { try { - wrapped.put("result", ret.toMap()); + if (ret == null) { + wrapped.put("result", null); + } else { + wrapped.put("result", ret.toMap()); + } + reply.reply(wrapped); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + reply.reply(wrapped); + Log.d("flutter", "error: " + exception); + } + }); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + reply.reply(wrapped); + Log.d("flutter", "error: " + exception); + } + }); + } else { + channel.setMessageHandler((message, reply) -> {}); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>(binaryMessenger, "com.didi.flutter.uni_api.DeviceInfoService.test", new StandardMessageCodec()); + if (impl != null) { + UDUniAPI.registerModule(impl); + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + Map params = (Map) message; + boolean st = params.containsKey("st") ? (boolean) params.get("st") : false; + long output = impl.test(st); + wrapped.put("result", output); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + Log.d("flutter", "error: " + exception); + } finally { + reply.reply(wrapped); + } + }); + } else { + channel.setMessageHandler((message, reply) -> {}); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>(binaryMessenger, "com.didi.flutter.uni_api.DeviceInfoService.test2", new StandardMessageCodec()); + if (impl != null) { + UDUniAPI.registerModule(impl); + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + Map params = (Map) message; + double st = params.containsKey("st") ? (double) params.get("st") : 0.0; + boolean output = impl.test2(st); + wrapped.put("result", output); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + Log.d("flutter", "error: " + exception); + } finally { + reply.reply(wrapped); + } + }); + } else { + channel.setMessageHandler((message, reply) -> {}); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>(binaryMessenger, "com.didi.flutter.uni_api.DeviceInfoService.test3", new StandardMessageCodec()); + if (impl != null) { + UDUniAPI.registerModule(impl); + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + Map params = (Map) message; + long st = params.containsKey("st") ? ((Number) params.get("st")).longValue() : 0; + String output = impl.test3(st); + wrapped.put("result", output); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + Log.d("flutter", "error: " + exception); + } finally { + reply.reply(wrapped); + } + }); + } else { + channel.setMessageHandler((message, reply) -> {}); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>(binaryMessenger, "com.didi.flutter.uni_api.DeviceInfoService.test4", new StandardMessageCodec()); + if (impl != null) { + UDUniAPI.registerModule(impl); + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + Map params = (Map) message; + long st = params.containsKey("st") ? ((Number) params.get("st")).longValue() : 0; + long output = impl.test4(st); + wrapped.put("result", output); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + Log.d("flutter", "error: " + exception); + } finally { + reply.reply(wrapped); + } + }); + } else { + channel.setMessageHandler((message, reply) -> {}); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>(binaryMessenger, "com.didi.flutter.uni_api.DeviceInfoService.test5", new StandardMessageCodec()); + if (impl != null) { + UDUniAPI.registerModule(impl); + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + Map params = (Map) message; + Map st = params.containsKey("st") ? (Map) params.get("st") : new HashMap<>(); + impl.test5(st, (ret) -> { + try { + if (ret == null) { + wrapped.put("result", null); + } else { + wrapped.put("result", ret); + } reply.reply(wrapped); } catch (Error | RuntimeException exception) { wrapped.put("error", wrapError(exception)); diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniAPI.java b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniAPI.java index bc056e4..5d49d83 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniAPI.java +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniAPI.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.uninativemodule_demo; @@ -7,6 +7,8 @@ import java.util.HashMap; import java.util.Map; +import io.flutter.plugin.common.BinaryMessenger; + public class UDUniAPI { private static boolean isInit = false; public static Map moduleMap = new HashMap<>(); diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallback.java b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallback.java index 267c266..9ec2c3c 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallback.java +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallback.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.uninativemodule_demo; diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallbackDispatcher.java b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallbackDispatcher.java index b7596cd..a1b4b2a 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallbackDispatcher.java +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallbackDispatcher.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.uninativemodule_demo; diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallbackDispose.java b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallbackDispose.java index c632a10..71c12e6 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallbackDispose.java +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/android/src/main/java/com/example/uninativemodule_demo/UDUniCallbackDispose.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.uninativemodule_demo; diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/example/ios/Runner/DeviceInfoServiceVendor.m b/packages/unify_uni_api/example/01_uninativemodule_demo/example/ios/Runner/DeviceInfoServiceVendor.m index 7cfcf09..16b4c5d 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/example/ios/Runner/DeviceInfoServiceVendor.m +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/example/ios/Runner/DeviceInfoServiceVendor.m @@ -51,4 +51,24 @@ - (NSString *)getTotalMemorySize { else if (fileSize < GB)return [NSString stringWithFormat:@"%.2f MB",((CGFloat)fileSize)/MB]; else return [NSString stringWithFormat:@"%.2f GB",((CGFloat)fileSize)/GB]; } + +- (NSInteger)test:(BOOL)st error:(FlutterError *_Nullable *_Nonnull)error { + NSLog(@"test - %d",st); + return 999; +} + +- (BOOL)test2:(double)st error:(FlutterError *_Nullable *_Nonnull)error { + NSLog(@"test2 - %f",st); + return YES; +} + +- (NSString*)test3:(NSInteger)st error:(FlutterError *_Nullable *_Nonnull)error { + NSLog(@"test3 - %ld",(long)st); + return @"test3"; +} + +- (NSNumber*)test4:(NSInteger)st error:(FlutterError *_Nullable *_Nonnull)error { + NSLog(@"test4 - %ld",(long)st); + return @(-1000); +} @end diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/example/lib/main.dart b/packages/unify_uni_api/example/01_uninativemodule_demo/example/lib/main.dart index 491b231..5a78725 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/example/lib/main.dart +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/example/lib/main.dart @@ -67,6 +67,42 @@ class _MyAppState extends State { }); }, ), + Text('test\n'), + OutlinedButton( + child: const Text("test"), + onPressed: () { + DeviceInfoService.test(false).then((deviceInfoModel) { + print('test - $deviceInfoModel'); + }); + }, + ), + Text('test2\n'), + OutlinedButton( + child: const Text("test2"), + onPressed: () { + DeviceInfoService.test2(9.999).then((deviceInfoModel) { + print('test - $deviceInfoModel'); + }); + }, + ), + Text('test3\n'), + OutlinedButton( + child: const Text("test"), + onPressed: () { + DeviceInfoService.test3(3000).then((deviceInfoModel) { + print('test - $deviceInfoModel'); + }); + }, + ), + Text('test4\n'), + OutlinedButton( + child: const Text("test4"), + onPressed: () { + DeviceInfoService.test4(4000).then((deviceInfoModel) { + print('test - $deviceInfoModel'); + }); + }, + ), ],) ), ), diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/interface/device_info_model.dart b/packages/unify_uni_api/example/01_uninativemodule_demo/interface/device_info_model.dart index 428af38..ea8d1ca 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/interface/device_info_model.dart +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/interface/device_info_model.dart @@ -11,4 +11,7 @@ class DeviceInfoModel { /// 手机型号 String? plaform; + + int? test; + bool? test2; } diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/interface/device_info_service.dart b/packages/unify_uni_api/example/01_uninativemodule_demo/interface/device_info_service.dart index 43bf49c..bed79d0 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/interface/device_info_service.dart +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/interface/device_info_service.dart @@ -5,4 +5,11 @@ import 'device_info_model.dart'; abstract class DeviceInfoService { /// 获取设备信息 Future getDeviceInfo(); + + int test(bool st); + bool test2(double st); + String test3(int st); + int? test4(int st); + + Future test5(Map st); } diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoModel.h b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoModel.h index 7808bc3..cc6b5e9 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoModel.h +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoModel.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import @@ -14,6 +14,8 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, copy) NSString* osVersion; // 系统版本 Origin dart type is 'String' @property(nonatomic, copy) NSString* memory; // 内存信息 Origin dart type is 'String' @property(nonatomic, copy) NSString* plaform; // 手机型号 Origin dart type is 'String' +@property(nonatomic, strong) NSNumber* test; // Origin dart type is 'int' +@property(nonatomic, strong) NSNumber* test2; // Origin dart type is 'bool' + (DeviceInfoModel*)fromMap:(NSDictionary*)dict; + (NSArray*)modelList:(NSArray*>*)list; diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoModel.m b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoModel.m index 766f34d..8c4963f 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoModel.m +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoModel.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import "DeviceInfoModel.h" @@ -42,6 +42,8 @@ + (DeviceInfoModel*)fromMap:(NSDictionary*)dict { result.osVersion = [self wrapNil:dict[@"osVersion"]]; result.memory = [self wrapNil:dict[@"memory"]]; result.plaform = [self wrapNil:dict[@"plaform"]]; + result.test = [self wrapNil:dict[@"test"]]; + result.test2 = [self wrapNil:dict[@"test2"]]; return result; } @@ -50,6 +52,8 @@ + (DeviceInfoModel*)fromMap:(NSDictionary*)dict { (self.osVersion ? self.osVersion : [NSNull null]), @"osVersion", (self.memory ? self.memory : [NSNull null]), @"memory", (self.plaform ? self.plaform : [NSNull null]), @"plaform", + (self.test ? self.test : [NSNull null]), @"test", + (self.test2 ? self.test2 : [NSNull null]), @"test2", nil]; } diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoService.h b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoService.h index d58cbbc..049d8f4 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoService.h +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoService.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import @@ -20,6 +20,11 @@ NS_ASSUME_NONNULL_BEGIN 获取设备信息 */ - (void)getDeviceInfo:(void(^)(DeviceInfoModel* result))success fail:(void(^)(FlutterError* error))fail; +- (NSInteger)test:(BOOL)st error:(FlutterError *_Nullable *_Nonnull)error; +- (BOOL)test2:(double)st error:(FlutterError *_Nullable *_Nonnull)error; +- (NSString*)test3:(NSInteger)st error:(FlutterError *_Nullable *_Nonnull)error; +- (NSNumber*)test4:(NSInteger)st error:(FlutterError *_Nullable *_Nonnull)error; +- (void)test5:(NSDictionary*)st success:(void(^)(NSInteger result))success fail:(void(^)(FlutterError* error))fail; @end diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoService.m b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoService.m index 131dea7..8e9c811 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoService.m +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/DeviceInfoService.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import "DeviceInfoService.h" @@ -102,4 +102,90 @@ void DeviceInfoServiceSetup(id binaryMessenger, id* st = [message objectForKey:@"st"]; + [api test5:st + success:^(NSInteger result) { + reply(wrapResult(@(result),nil)); + } + + fail:^(FlutterError* error) { + reply(wrapResult(nil,error)); + } + ]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } } diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniAPI.h b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniAPI.h index 64a4470..5d4c406 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniAPI.h +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniAPI.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniAPI.m b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniAPI.m index be517a0..564e2e4 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniAPI.m +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniAPI.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import "UDUniAPI.h" diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniCallbackDispatcher.h b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniCallbackDispatcher.h index 6999b04..5244848 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniCallbackDispatcher.h +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniCallbackDispatcher.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniCallbackDispatcher.m b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniCallbackDispatcher.m index af68df2..ec6829d 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniCallbackDispatcher.m +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/ios/Classes/UDUniCallbackDispatcher.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import "UDUniCallbackDispatcher.h" diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/lib/device_info_model.dart b/packages/unify_uni_api/example/01_uninativemodule_demo/lib/device_info_model.dart index 0abee4f..79d16d6 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/lib/device_info_model.dart +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/lib/device_info_model.dart @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= @@ -8,12 +8,16 @@ class DeviceInfoModel { String? osVersion; /// 系统版本 String? memory; /// 内存信息 String? plaform; /// 手机型号 + int? test; + bool? test2; Object encode() { final Map ret = {}; ret['osVersion'] = osVersion as String?; ret['memory'] = memory as String?; ret['plaform'] = plaform as String?; + ret['test'] = test as int?; + ret['test2'] = test2 as bool?; return ret; } @@ -30,6 +34,12 @@ class DeviceInfoModel { ..plaform = map['plaform'] == null ? '' : map['plaform'] as String? + ..test = map['test'] == null + ? 0 + : map['test'] as int? + ..test2 = map['test2'] == null + ? false + : map['test2'] as bool? ; } } diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/lib/device_info_service.dart b/packages/unify_uni_api/example/01_uninativemodule_demo/lib/device_info_service.dart index 3875b9c..41b14e5 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/lib/device_info_service.dart +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/lib/device_info_service.dart @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= import 'dart:async'; @@ -46,4 +46,184 @@ class DeviceInfoService { throw Exception('方法 "getDeviceInfo" : 返回类型错误!'); } + static Future test(bool st) async { + final Map encoded = {}; + encoded["st"] = st as bool; + const BasicMessageChannel channel = BasicMessageChannel ( + 'com.didi.flutter.uni_api.DeviceInfoService.test', StandardMessageCodec()); + final Map? replyMap = + await channel.send(encoded) as Map?; + if (replyMap == null) { + UniApi.trackError('DeviceInfoService', 'com.didi.flutter.uni_api.DeviceInfoService.test', 'Unable to establish connection on channel : "com.didi.flutter.uni_api.DeviceInfoService.test" .'); + if (!kReleaseMode) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel : "com.didi.flutter.uni_api.DeviceInfoService.test" .', + details: null, + ); + } + } else if (replyMap['error'] != null) { + final Map error = (replyMap['error'] as Map); + String errorMsg = ''; + if (error.containsKey('code')) errorMsg += '[ ${error['code']?.toString() ?? ''} ]'; + if (error.containsKey('message')) errorMsg += '[ ${error['message']?.toString() ?? ''} ]'; + if (error.containsKey('details')) errorMsg += '[ ${error['details']?.toString() ?? ''} ]'; + UniApi.trackError('DeviceInfoService', 'com.didi.flutter.uni_api.DeviceInfoService.test', 'test: $errorMsg);'); + if (!kReleaseMode) { + throw PlatformException( + code: error['code'] as String, + message: error['message'] as String, + details: error['details'], + ); + } + } else { + return replyMap['result'] as int; + } + throw Exception('方法 "test" : 返回类型错误!'); + } + + static Future test2(double st) async { + final Map encoded = {}; + encoded["st"] = st as double; + const BasicMessageChannel channel = BasicMessageChannel ( + 'com.didi.flutter.uni_api.DeviceInfoService.test2', StandardMessageCodec()); + final Map? replyMap = + await channel.send(encoded) as Map?; + if (replyMap == null) { + UniApi.trackError('DeviceInfoService', 'com.didi.flutter.uni_api.DeviceInfoService.test2', 'Unable to establish connection on channel : "com.didi.flutter.uni_api.DeviceInfoService.test2" .'); + if (!kReleaseMode) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel : "com.didi.flutter.uni_api.DeviceInfoService.test2" .', + details: null, + ); + } + } else if (replyMap['error'] != null) { + final Map error = (replyMap['error'] as Map); + String errorMsg = ''; + if (error.containsKey('code')) errorMsg += '[ ${error['code']?.toString() ?? ''} ]'; + if (error.containsKey('message')) errorMsg += '[ ${error['message']?.toString() ?? ''} ]'; + if (error.containsKey('details')) errorMsg += '[ ${error['details']?.toString() ?? ''} ]'; + UniApi.trackError('DeviceInfoService', 'com.didi.flutter.uni_api.DeviceInfoService.test2', 'test2: $errorMsg);'); + if (!kReleaseMode) { + throw PlatformException( + code: error['code'] as String, + message: error['message'] as String, + details: error['details'], + ); + } + } else { + return replyMap['result'] as bool; + } + throw Exception('方法 "test2" : 返回类型错误!'); + } + + static Future test3(int st) async { + final Map encoded = {}; + encoded["st"] = st as int; + const BasicMessageChannel channel = BasicMessageChannel ( + 'com.didi.flutter.uni_api.DeviceInfoService.test3', StandardMessageCodec()); + final Map? replyMap = + await channel.send(encoded) as Map?; + if (replyMap == null) { + UniApi.trackError('DeviceInfoService', 'com.didi.flutter.uni_api.DeviceInfoService.test3', 'Unable to establish connection on channel : "com.didi.flutter.uni_api.DeviceInfoService.test3" .'); + if (!kReleaseMode) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel : "com.didi.flutter.uni_api.DeviceInfoService.test3" .', + details: null, + ); + } + } else if (replyMap['error'] != null) { + final Map error = (replyMap['error'] as Map); + String errorMsg = ''; + if (error.containsKey('code')) errorMsg += '[ ${error['code']?.toString() ?? ''} ]'; + if (error.containsKey('message')) errorMsg += '[ ${error['message']?.toString() ?? ''} ]'; + if (error.containsKey('details')) errorMsg += '[ ${error['details']?.toString() ?? ''} ]'; + UniApi.trackError('DeviceInfoService', 'com.didi.flutter.uni_api.DeviceInfoService.test3', 'test3: $errorMsg);'); + if (!kReleaseMode) { + throw PlatformException( + code: error['code'] as String, + message: error['message'] as String, + details: error['details'], + ); + } + } else { + return replyMap['result'] as String; + } + throw Exception('方法 "test3" : 返回类型错误!'); + } + + static Future test4(int st) async { + final Map encoded = {}; + encoded["st"] = st as int; + const BasicMessageChannel channel = BasicMessageChannel ( + 'com.didi.flutter.uni_api.DeviceInfoService.test4', StandardMessageCodec()); + final Map? replyMap = + await channel.send(encoded) as Map?; + if (replyMap == null) { + UniApi.trackError('DeviceInfoService', 'com.didi.flutter.uni_api.DeviceInfoService.test4', 'Unable to establish connection on channel : "com.didi.flutter.uni_api.DeviceInfoService.test4" .'); + if (!kReleaseMode) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel : "com.didi.flutter.uni_api.DeviceInfoService.test4" .', + details: null, + ); + } + } else if (replyMap['error'] != null) { + final Map error = (replyMap['error'] as Map); + String errorMsg = ''; + if (error.containsKey('code')) errorMsg += '[ ${error['code']?.toString() ?? ''} ]'; + if (error.containsKey('message')) errorMsg += '[ ${error['message']?.toString() ?? ''} ]'; + if (error.containsKey('details')) errorMsg += '[ ${error['details']?.toString() ?? ''} ]'; + UniApi.trackError('DeviceInfoService', 'com.didi.flutter.uni_api.DeviceInfoService.test4', 'test4: $errorMsg);'); + if (!kReleaseMode) { + throw PlatformException( + code: error['code'] as String, + message: error['message'] as String, + details: error['details'], + ); + } + } else { + return replyMap['result'] == null ? null : replyMap['result'] as int?; + } + throw Exception('方法 "test4" : 返回类型错误!'); + } + + static Future test5(Map st) async { + final Map encoded = {}; + encoded["st"] = st as Map; + const BasicMessageChannel channel = BasicMessageChannel ( + 'com.didi.flutter.uni_api.DeviceInfoService.test5', StandardMessageCodec()); + final Map? replyMap = + await channel.send(encoded) as Map?; + if (replyMap == null) { + UniApi.trackError('DeviceInfoService', 'com.didi.flutter.uni_api.DeviceInfoService.test5', 'Unable to establish connection on channel : "com.didi.flutter.uni_api.DeviceInfoService.test5" .'); + if (!kReleaseMode) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel : "com.didi.flutter.uni_api.DeviceInfoService.test5" .', + details: null, + ); + } + } else if (replyMap['error'] != null) { + final Map error = (replyMap['error'] as Map); + String errorMsg = ''; + if (error.containsKey('code')) errorMsg += '[ ${error['code']?.toString() ?? ''} ]'; + if (error.containsKey('message')) errorMsg += '[ ${error['message']?.toString() ?? ''} ]'; + if (error.containsKey('details')) errorMsg += '[ ${error['details']?.toString() ?? ''} ]'; + UniApi.trackError('DeviceInfoService', 'com.didi.flutter.uni_api.DeviceInfoService.test5', 'test5: $errorMsg);'); + if (!kReleaseMode) { + throw PlatformException( + code: error['code'] as String, + message: error['message'] as String, + details: error['details'], + ); + } + } else { + return replyMap['result'] as int; + } + throw Exception('方法 "test5" : 返回类型错误!'); + } + } diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/lib/uniapi/uni_callback_manager.dart b/packages/unify_uni_api/example/01_uninativemodule_demo/lib/uniapi/uni_callback_manager.dart index e486e2f..d97f6cd 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/lib/uniapi/uni_callback_manager.dart +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/lib/uniapi/uni_callback_manager.dart @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= import '../device_info_model.dart'; @@ -48,6 +48,11 @@ class UniCallbackManager { continue; } + if (callback.getType().toString() == 'void') { + callback.onEvent(data, disposable); + continue; + } + if (callback.getType() == bool) { (callback as UniCallback).onEvent(data as bool, disposable); continue; diff --git a/packages/unify_uni_api/example/01_uninativemodule_demo/pubspec.lock b/packages/unify_uni_api/example/01_uninativemodule_demo/pubspec.lock index 6358d56..f2e8d08 100644 --- a/packages/unify_uni_api/example/01_uninativemodule_demo/pubspec.lock +++ b/packages/unify_uni_api/example/01_uninativemodule_demo/pubspec.lock @@ -270,7 +270,7 @@ packages: path: "../.." relative: true source: path - version: "3.0.4" + version: "3.0.5" vector_math: dependency: transitive description: diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/LocationInfoModel.java b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/LocationInfoModel.java index af0d7a7..6089d74 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/LocationInfoModel.java +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/LocationInfoModel.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.unifluttermodule_demo; diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/LocationInfoService.java b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/LocationInfoService.java index a1aa502..d63468e 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/LocationInfoService.java +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/LocationInfoService.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.unifluttermodule_demo; @@ -78,6 +78,8 @@ private static Map mapConvert(Map map, String[] public void setup(BinaryMessenger messenger) { this.messenger = messenger; UFUniAPI.registerModule(this); + new BasicMessageChannel<>(messenger, "com.didi.flutter.uni_api.LocationInfoService.updateLocationInfo", new StandardMessageCodec()).resizeChannelBuffer(100); + new BasicMessageChannel<>(messenger, "com.didi.flutter.uni_api.LocationInfoService.test5", new StandardMessageCodec()).resizeChannelBuffer(999); } public interface Result { @@ -92,4 +94,74 @@ public void updateLocationInfo(LocationInfoModel model) { parameters.put("model", model.toMap()); channel.send(parameters); } + public void test(boolean st, Result callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>(messenger, "com.didi.flutter.uni_api.LocationInfoService.test", new StandardMessageCodec()); + Map parameters = new HashMap<>(); + parameters.put("st", st); + channel.send(parameters, reply -> + { + if (callback != null) + { + callback.result(((Number) reply).longValue()); + } + } + ); + } + public void test2(double st, Result callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>(messenger, "com.didi.flutter.uni_api.LocationInfoService.test2", new StandardMessageCodec()); + Map parameters = new HashMap<>(); + parameters.put("st", st); + channel.send(parameters, reply -> + { + if (callback != null) + { + callback.result((Boolean) reply); + } + } + ); + } + public void test3(long st, Result callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>(messenger, "com.didi.flutter.uni_api.LocationInfoService.test3", new StandardMessageCodec()); + Map parameters = new HashMap<>(); + parameters.put("st", st); + channel.send(parameters, reply -> + { + if (callback != null) + { + callback.result((String) reply); + } + } + ); + } + public void test4(long st, Result callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>(messenger, "com.didi.flutter.uni_api.LocationInfoService.test4", new StandardMessageCodec()); + Map parameters = new HashMap<>(); + parameters.put("st", st); + channel.send(parameters, reply -> + { + if (callback != null) + { + callback.result(((Number) reply).longValue()); + } + } + ); + } + public void test5(Map st, Result callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>(messenger, "com.didi.flutter.uni_api.LocationInfoService.test5", new StandardMessageCodec()); + Map parameters = new HashMap<>(); + parameters.put("st", st); + channel.send(parameters, reply -> + { + if (callback != null) + { + callback.result(((Number) reply).longValue()); + } + } + ); + } } diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniAPI.java b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniAPI.java index fe8b123..81f26cd 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniAPI.java +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniAPI.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.unifluttermodule_demo; @@ -7,6 +7,8 @@ import java.util.HashMap; import java.util.Map; +import io.flutter.plugin.common.BinaryMessenger; + public class UFUniAPI { private static boolean isInit = false; public static Map moduleMap = new HashMap<>(); diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallback.java b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallback.java index 562b66a..1e71289 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallback.java +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallback.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.unifluttermodule_demo; diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallbackDispatcher.java b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallbackDispatcher.java index 1373bfc..e122d1a 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallbackDispatcher.java +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallbackDispatcher.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.unifluttermodule_demo; diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallbackDispose.java b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallbackDispose.java index 2a9ee5e..4a5583f 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallbackDispose.java +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/android/src/main/java/com/example/unifluttermodule_demo/UFUniCallbackDispose.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= package com.example.unifluttermodule_demo; diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/example/lib/location_info_service_impl.dart b/packages/unify_uni_api/example/02_unifluttermodule_demo/example/lib/location_info_service_impl.dart index 592dd96..bbf2f2e 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/example/lib/location_info_service_impl.dart +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/example/lib/location_info_service_impl.dart @@ -8,4 +8,34 @@ class LocationInfoServiceImpl extends LocationInfoService { // TODO: implement updateLocationInfo myEventBus.fire(model.encode().toString()); } + + @override + int test(bool st) { + // TODO: implement test + throw UnimplementedError(); + } + + @override + bool test2(double st) { + // TODO: implement test2 + throw UnimplementedError(); + } + + @override + String test3(int st) { + // TODO: implement test3 + throw UnimplementedError(); + } + + @override + int? test4(int st) { + // TODO: implement test4 + throw UnimplementedError(); + } + + @override + Future test5(Map st) { + // TODO: implement test5 + throw UnimplementedError(); + } } diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/interface/location_info_service.dart b/packages/unify_uni_api/example/02_unifluttermodule_demo/interface/location_info_service.dart index 2ca4fd7..b44d8d0 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/interface/location_info_service.dart +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/interface/location_info_service.dart @@ -4,5 +4,16 @@ import 'location_info_model.dart'; @UniFlutterModule() abstract class LocationInfoService { /// 更新定位信息 + /// + /// 通过 @UniBufferSize 将该 channel 的消息缓冲区扩大到 100, + /// 避免原生在 Dart 侧 handler 注册前连续发消息导致的丢消息问题。 + @UniBufferSize(100) void updateLocationInfo(LocationInfoModel model); + int test(bool st); + bool test2(double st); + String test3(int st); + int? test4(int st); + + @UniBufferSize(999) + Future test5(Map st); } diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoModel.h b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoModel.h index 79b1063..9b31a49 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoModel.h +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoModel.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoModel.m b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoModel.m index 2b1e3af..b3320a8 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoModel.m +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoModel.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import "LocationInfoModel.h" diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoService.h b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoService.h index daf80fb..d832522 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoService.h +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoService.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import @@ -16,6 +16,11 @@ typedef void (^UniCompleted)(id result); // 这里result可能是nil + (void)setup:(id)binaryMessenger; + (void)updateLocationInfo:(LocationInfoModel*)model; ++ (void)test:(BOOL)st result:(UniCompleted)result; ++ (void)test2:(double)st result:(UniCompleted)result; ++ (void)test3:(NSInteger)st result:(UniCompleted)result; ++ (void)test4:(NSInteger)st result:(UniCompleted)result; ++ (void)test5:(NSDictionary*)st result:(UniCompleted)result; @end diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoService.m b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoService.m index 216f54e..ee6282d 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoService.m +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/LocationInfoService.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import "LocationInfoService.h" @@ -84,6 +84,8 @@ + (instancetype)instance { + (void)setup:(id)binaryMessenger { [[self instance] setBinaryMessenger:binaryMessenger]; + [[FlutterBasicMessageChannel messageChannelWithName:@"com.didi.flutter.uni_api.LocationInfoService.updateLocationInfo" binaryMessenger:binaryMessenger] resizeChannelBuffer:100]; + [[FlutterBasicMessageChannel messageChannelWithName:@"com.didi.flutter.uni_api.LocationInfoService.test5" binaryMessenger:binaryMessenger] resizeChannelBuffer:999]; } + (void)updateLocationInfo:(LocationInfoModel*)model { FlutterBasicMessageChannel *channel = @@ -100,6 +102,91 @@ + (void)updateLocationInfo:(LocationInfoModel*)model { [channel sendMessage:msg]; } ++ (void)test:(BOOL)st result:(UniCompleted)result { + FlutterBasicMessageChannel *channel = + [FlutterBasicMessageChannel + messageChannelWithName:@"com.didi.flutter.uni_api.LocationInfoService.test" + binaryMessenger:[[self instance] binaryMessenger]]; + + // 数据处理 + NSDictionary *msg = [NSDictionary dictionaryWithObjectsAndKeys: + [self wrapNil:@(st)], @"st", + nil]; + + // 发送消息 + [channel sendMessage:msg reply:^(id _Nullable reply) { + if (reply && result) result(reply); + }]; +} + ++ (void)test2:(double)st result:(UniCompleted)result { + FlutterBasicMessageChannel *channel = + [FlutterBasicMessageChannel + messageChannelWithName:@"com.didi.flutter.uni_api.LocationInfoService.test2" + binaryMessenger:[[self instance] binaryMessenger]]; + + // 数据处理 + NSDictionary *msg = [NSDictionary dictionaryWithObjectsAndKeys: + [self wrapNil:@(st)], @"st", + nil]; + + // 发送消息 + [channel sendMessage:msg reply:^(id _Nullable reply) { + if (reply && result) result(reply); + }]; +} + ++ (void)test3:(NSInteger)st result:(UniCompleted)result { + FlutterBasicMessageChannel *channel = + [FlutterBasicMessageChannel + messageChannelWithName:@"com.didi.flutter.uni_api.LocationInfoService.test3" + binaryMessenger:[[self instance] binaryMessenger]]; + + // 数据处理 + NSDictionary *msg = [NSDictionary dictionaryWithObjectsAndKeys: + [self wrapNil:@(st)], @"st", + nil]; + + // 发送消息 + [channel sendMessage:msg reply:^(id _Nullable reply) { + if (reply && result) result(reply); + }]; +} + ++ (void)test4:(NSInteger)st result:(UniCompleted)result { + FlutterBasicMessageChannel *channel = + [FlutterBasicMessageChannel + messageChannelWithName:@"com.didi.flutter.uni_api.LocationInfoService.test4" + binaryMessenger:[[self instance] binaryMessenger]]; + + // 数据处理 + NSDictionary *msg = [NSDictionary dictionaryWithObjectsAndKeys: + [self wrapNil:@(st)], @"st", + nil]; + + // 发送消息 + [channel sendMessage:msg reply:^(id _Nullable reply) { + if (reply && result) result(reply); + }]; +} + ++ (void)test5:(NSDictionary*)st result:(UniCompleted)result { + FlutterBasicMessageChannel *channel = + [FlutterBasicMessageChannel + messageChannelWithName:@"com.didi.flutter.uni_api.LocationInfoService.test5" + binaryMessenger:[[self instance] binaryMessenger]]; + + // 数据处理 + NSDictionary *msg = [NSDictionary dictionaryWithObjectsAndKeys: + [self wrapNil:st], @"st", + nil]; + + // 发送消息 + [channel sendMessage:msg reply:^(id _Nullable reply) { + if (reply && result) result(reply); + }]; +} + + (id)wrapNil:(id)value { return value == nil ? [NSNull null] : value; } diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniAPI.h b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniAPI.h index 3f13640..e716e4c 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniAPI.h +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniAPI.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniAPI.m b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniAPI.m index 55d0de5..6748a5d 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniAPI.m +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniAPI.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import "UFUniAPI.h" diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniCallbackDispatcher.h b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniCallbackDispatcher.h index 91b56b2..91ad8f6 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniCallbackDispatcher.h +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniCallbackDispatcher.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniCallbackDispatcher.m b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniCallbackDispatcher.m index 14839f8..0aa5d7f 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniCallbackDispatcher.m +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/ios/Classes/UFUniCallbackDispatcher.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= #import "UFUniCallbackDispatcher.h" diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/location_info_model.dart b/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/location_info_model.dart index 8a2dd02..c6eab7e 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/location_info_model.dart +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/location_info_model.dart @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/location_info_service.dart b/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/location_info_service.dart index a9bc3d2..36c55c6 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/location_info_service.dart +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/location_info_service.dart @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= import 'package:flutter/services.dart'; @@ -11,6 +11,16 @@ abstract class LocationInfoService { void updateLocationInfo(LocationInfoModel model); + int test(bool st); + + bool test2(double st); + + String test3(int st); + + int? test4(int st); + + Future test5(Map st); + static void setup(LocationInfoService impl) { { const BasicMessageChannel channel = BasicMessageChannel('com.didi.flutter.uni_api.LocationInfoService.updateLocationInfo', StandardMessageCodec()); @@ -20,5 +30,51 @@ abstract class LocationInfoService { impl.updateLocationInfo(LocationInfoModel.decode(wrapped['model']!)); }); } + { + const BasicMessageChannel channel = BasicMessageChannel('com.didi.flutter.uni_api.LocationInfoService.test', StandardMessageCodec()); + channel.setMessageHandler((Object? message) async { + if (message == null) return null; + Map wrapped = message as Map; + var implResult = impl.test(wrapped['st'] as bool); + return implResult as int; + }); + } + { + const BasicMessageChannel channel = BasicMessageChannel('com.didi.flutter.uni_api.LocationInfoService.test2', StandardMessageCodec()); + channel.setMessageHandler((Object? message) async { + if (message == null) return null; + Map wrapped = message as Map; + var implResult = impl.test2(wrapped['st'] as double); + return implResult as bool; + }); + } + { + const BasicMessageChannel channel = BasicMessageChannel('com.didi.flutter.uni_api.LocationInfoService.test3', StandardMessageCodec()); + channel.setMessageHandler((Object? message) async { + if (message == null) return null; + Map wrapped = message as Map; + var implResult = impl.test3(wrapped['st'] as int); + return implResult as String; + }); + } + { + const BasicMessageChannel channel = BasicMessageChannel('com.didi.flutter.uni_api.LocationInfoService.test4', StandardMessageCodec()); + channel.setMessageHandler((Object? message) async { + if (message == null) return null; + Map wrapped = message as Map; + var implResult = impl.test4(wrapped['st'] as int); + if (implResult == null ) return null; + return implResult as int?; + }); + } + { + const BasicMessageChannel channel = BasicMessageChannel('com.didi.flutter.uni_api.LocationInfoService.test5', StandardMessageCodec()); + channel.setMessageHandler((Object? message) async { + if (message == null) return null; + Map wrapped = message as Map; + var implResult = await impl.test5((wrapped['st'] as Map).map((key, value) => MapEntry(key as String, value as int))); + return implResult as int; + }); + } } } diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/uniapi/uni_callback_manager.dart b/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/uniapi/uni_callback_manager.dart index de6c152..08435fb 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/uniapi/uni_callback_manager.dart +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/lib/uniapi/uni_callback_manager.dart @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.6, do not edit directly. // ================================================= import '../location_info_model.dart'; @@ -48,6 +48,11 @@ class UniCallbackManager { continue; } + if (callback.getType().toString() == 'void') { + callback.onEvent(data, disposable); + continue; + } + if (callback.getType() == bool) { (callback as UniCallback).onEvent(data as bool, disposable); continue; diff --git a/packages/unify_uni_api/example/02_unifluttermodule_demo/pubspec.lock b/packages/unify_uni_api/example/02_unifluttermodule_demo/pubspec.lock index 6358d56..f2e8d08 100644 --- a/packages/unify_uni_api/example/02_unifluttermodule_demo/pubspec.lock +++ b/packages/unify_uni_api/example/02_unifluttermodule_demo/pubspec.lock @@ -270,7 +270,7 @@ packages: path: "../.." relative: true source: path - version: "3.0.4" + version: "3.0.5" vector_math: dependency: transitive description: diff --git a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/LocationInfoModel.java b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/LocationInfoModel.java index fe5e0f5..2af337c 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/LocationInfoModel.java +++ b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/LocationInfoModel.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= package com.example.unicallback_demo; diff --git a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniAPI.java b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniAPI.java index d18d16b..801c3ad 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniAPI.java +++ b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniAPI.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= package com.example.unicallback_demo; @@ -7,6 +7,8 @@ import java.util.HashMap; import java.util.Map; +import io.flutter.plugin.common.BinaryMessenger; + public class UFUniAPI { private static boolean isInit = false; public static Map moduleMap = new HashMap<>(); diff --git a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallback.java b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallback.java index fa1d302..cf68947 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallback.java +++ b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallback.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= package com.example.unicallback_demo; diff --git a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallbackDispatcher.java b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallbackDispatcher.java index 7575e10..e86472a 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallbackDispatcher.java +++ b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallbackDispatcher.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= package com.example.unicallback_demo; diff --git a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallbackDispose.java b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallbackDispose.java index 1eac08f..b306f6d 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallbackDispose.java +++ b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UFUniCallbackDispose.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= package com.example.unicallback_demo; diff --git a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UniCallbackTestService.java b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UniCallbackTestService.java index 832575d..e216e75 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UniCallbackTestService.java +++ b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UniCallbackTestService.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= package com.example.unicallback_demo; @@ -11,6 +11,8 @@ import io.flutter.plugin.common.BasicMessageChannel; import io.flutter.plugin.common.StandardMessageCodec; import com.example.unicallback_demo.LocationInfoModel; +import com.example.unicallback_demo.UFUniCallback; +import com.example.unicallback_demo.UFUniCallbackDispose; /* Call flow direction : dart -> native @@ -50,6 +52,22 @@ public void onEvent(String event) { new BasicMessageChannel<>(messenger, "com.didi.flutter.uni_api.UniCallbackManager.callback_channel.uf", StandardMessageCodec.INSTANCE).send(message); } } + class OnDoCallbackAction2Callback extends UFUniCallback { + private BinaryMessenger messenger; + + + public OnDoCallbackAction2Callback(BinaryMessenger messenger, String callbackName, UFUniCallbackDispose disposeDelegate) { + super(callbackName, disposeDelegate); + this.messenger = messenger; + } + + public void onEvent(boolean event) { + Map message = new HashMap<>(); + message.put("callbackName", callbackName); + message.put("data", event); + new BasicMessageChannel<>(messenger, "com.didi.flutter.uni_api.UniCallbackManager.callback_channel.uf", StandardMessageCodec.INSTANCE).send(message); + } + } /* 更新定位信息 */ @@ -57,4 +75,6 @@ public void onEvent(String event) { void doCallbackAction1(OnDoCallbackAction1Callback callback); + void doCallbackAction2(OnDoCallbackAction2Callback callback); + } diff --git a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UniCallbackTestServiceRegister.java b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UniCallbackTestServiceRegister.java index 25542b2..38be71f 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UniCallbackTestServiceRegister.java +++ b/packages/unify_uni_api/example/03_unicallback_demo/android/src/main/java/com/example/unicallback_demo/UniCallbackTestServiceRegister.java @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= package com.example.unicallback_demo; @@ -14,6 +14,8 @@ import io.flutter.plugin.common.StandardMessageCodec; import com.example.unicallback_demo.UFUniAPI; import static com.example.unicallback_demo.uniapi.UniModel.map; + +import com.example.unicallback_demo.UFUniCallbackDispatcher; import com.example.unicallback_demo.LocationInfoModel; public class UniCallbackTestServiceRegister { @@ -124,6 +126,31 @@ public static void setup(BinaryMessenger binaryMessenger, UniCallbackTestService channel.setMessageHandler((message, reply) -> {}); } } + { + BasicMessageChannel channel = + new BasicMessageChannel<>(binaryMessenger, "com.didi.flutter.uni_api.UniCallbackTestService.doCallbackAction2", new StandardMessageCodec()); + if (impl != null) { + UFUniAPI.registerModule(impl); + channel.setMessageHandler((message, reply) -> { + Map wrapped = new HashMap<>(); + try { + Map params = (Map) message; + String callbackName = (String) params.get("callback"); + UniCallbackTestService.OnDoCallbackAction2Callback callback = new UniCallbackTestService.OnDoCallbackAction2Callback(binaryMessenger, callbackName, impl); + UFUniCallbackDispatcher.registerCallback(callbackName, callback); + impl.doCallbackAction2(callback); + wrapped.put("result", null); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + Log.d("flutter", "error: " + exception); + } finally { + reply.reply(wrapped); + } + }); + } else { + channel.setMessageHandler((message, reply) -> {}); + } + } } private static Map wrapError(Throwable exception) { diff --git a/packages/unify_uni_api/example/03_unicallback_demo/interface/uni_callback_test_service.dart b/packages/unify_uni_api/example/03_unicallback_demo/interface/uni_callback_test_service.dart index 4001f01..c664c0f 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/interface/uni_callback_test_service.dart +++ b/packages/unify_uni_api/example/03_unicallback_demo/interface/uni_callback_test_service.dart @@ -8,4 +8,6 @@ abstract class UniCallbackTestService { void doCallbackAction0(UniCallback callback); void doCallbackAction1(UniCallback callback); + + void doCallbackAction2(UniCallback callback); } diff --git a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/LocationInfoModel.h b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/LocationInfoModel.h index 79b1063..fcc5854 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/LocationInfoModel.h +++ b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/LocationInfoModel.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= #import diff --git a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/LocationInfoModel.m b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/LocationInfoModel.m index 2b1e3af..149efea 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/LocationInfoModel.m +++ b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/LocationInfoModel.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= #import "LocationInfoModel.h" diff --git a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniAPI.h b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniAPI.h index 3f13640..8e01af9 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniAPI.h +++ b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniAPI.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= #import diff --git a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniAPI.m b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniAPI.m index 55d0de5..7812b14 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniAPI.m +++ b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniAPI.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= #import "UFUniAPI.h" diff --git a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniCallbackDispatcher.h b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniCallbackDispatcher.h index 91b56b2..1674531 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniCallbackDispatcher.h +++ b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniCallbackDispatcher.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= #import diff --git a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniCallbackDispatcher.m b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniCallbackDispatcher.m index 14839f8..48f62e9 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniCallbackDispatcher.m +++ b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UFUniCallbackDispatcher.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= #import "UFUniCallbackDispatcher.h" diff --git a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UniCallbackTestService.h b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UniCallbackTestService.h index 19b5df1..7d5524b 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UniCallbackTestService.h +++ b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UniCallbackTestService.h @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= #import @@ -29,6 +29,15 @@ NS_ASSUME_NONNULL_BEGIN @end +@interface OnDoCallbackAction2Callback : NSObject + +@property(nonatomic, copy) NSString* callbackName; // Origin dart type is 'String' +@property(nonatomic, weak) id delegate; // Origin dart type is 'id' + +- (void)onEvent:(BOOL)callback; + +@end + /* Call flow direction : dart -> native */ @@ -40,6 +49,7 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)doCallbackAction0:(OnDoCallbackAction0Callback*)callback error:(FlutterError *_Nullable *_Nonnull)error; - (void)doCallbackAction1:(OnDoCallbackAction1Callback*)callback error:(FlutterError *_Nullable *_Nonnull)error; +- (void)doCallbackAction2:(OnDoCallbackAction2Callback*)callback error:(FlutterError *_Nullable *_Nonnull)error; @end diff --git a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UniCallbackTestService.m b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UniCallbackTestService.m index 725704a..43cf5db 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UniCallbackTestService.m +++ b/packages/unify_uni_api/example/03_unicallback_demo/ios/Classes/UniCallbackTestService.m @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= #import "UniCallbackTestService.h" @@ -19,6 +19,12 @@ @interface OnDoCallbackAction1Callback () @end +@interface OnDoCallbackAction2Callback () + +@property(nonatomic, weak) id binaryMessenger; // Origin dart type is 'id' + +@end + @implementation OnDoCallbackAction0Callback @@ -56,6 +62,24 @@ - (void)onEvent:(NSString*)callback { @end +@implementation OnDoCallbackAction2Callback + +- (void)onEvent:(BOOL)callback { + // 参数判空检查 + if (callback == NULL) { + return; + } + FlutterBasicMessageChannel *channel = + [FlutterBasicMessageChannel + messageChannelWithName:@"com.didi.flutter.uni_api.UniCallbackManager.callback_channel.uf" + binaryMessenger:self.binaryMessenger]; + NSDictionary *msg = @{@"callbackName":self.callbackName,@"data":callback}; + // 发送消息 + [channel sendMessage:msg]; +} + +@end + static NSDictionary * mapClone(NSDictionary *dic); static NSArray * listClone(NSArray *list) { @@ -171,4 +195,24 @@ void UniCallbackTestServiceSetup(id binaryMessenger, id< [channel setMessageHandler:nil]; } } + { + FlutterBasicMessageChannel *channel = + [FlutterBasicMessageChannel + messageChannelWithName:@"com.didi.flutter.uni_api.UniCallbackTestService.doCallbackAction2" + binaryMessenger:binaryMessenger]; + if (api) { + [channel setMessageHandler:^(id _Nullable message, FlutterReply reply) { + NSString *callbackName = [message objectForKey:@"callback"]; + OnDoCallbackAction2Callback *callback = OnDoCallbackAction2Callback.new; + callback.callbackName = callbackName; + callback.binaryMessenger = binaryMessenger; + [UFUniCallbackDispatcher registe:callbackName callback:callback]; + FlutterError *error; + [api doCallbackAction2:callback error:&error]; + reply(wrapResult(nil, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } } diff --git a/packages/unify_uni_api/example/03_unicallback_demo/lib/location_info_model.dart b/packages/unify_uni_api/example/03_unicallback_demo/lib/location_info_model.dart index 8a2dd02..e0849f7 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/lib/location_info_model.dart +++ b/packages/unify_uni_api/example/03_unicallback_demo/lib/location_info_model.dart @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= diff --git a/packages/unify_uni_api/example/03_unicallback_demo/lib/uni_callback_test_service.dart b/packages/unify_uni_api/example/03_unicallback_demo/lib/uni_callback_test_service.dart index 2fbd4c7..4ad20a2 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/lib/uni_callback_test_service.dart +++ b/packages/unify_uni_api/example/03_unicallback_demo/lib/uni_callback_test_service.dart @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= import 'dart:async'; @@ -91,4 +91,42 @@ class UniCallbackTestService { } } + static Future doCallbackAction2(UniCallback callback) async { + callback.callbackName = 'UniCallbackTestService_doCallbackAction2_callback_${callback.hashCode}'; + uniCallbackCache['UniCallbackTestService_doCallbackAction2_callback_${callback.hashCode}'] = callback; + final Map encoded = {}; + encoded["callback"] = 'UniCallbackTestService_doCallbackAction2_callback_${callback.hashCode}'; + const BasicMessageChannel channel = BasicMessageChannel ( + 'com.didi.flutter.uni_api.UniCallbackTestService.doCallbackAction2', StandardMessageCodec()); + UniCallbackManager.getInstance(); + final Map? replyMap = + await channel.send(encoded) as Map?; + if (replyMap == null) { + UniApi.trackError('UniCallbackTestService', 'com.didi.flutter.uni_api.UniCallbackTestService.doCallbackAction2', 'Unable to establish connection on channel : "com.didi.flutter.uni_api.UniCallbackTestService.doCallbackAction2" .'); + if (!kReleaseMode) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel : "com.didi.flutter.uni_api.UniCallbackTestService.doCallbackAction2" .', + details: null, + ); + } + } else if (replyMap['error'] != null) { + final Map error = (replyMap['error'] as Map); + String errorMsg = ''; + if (error.containsKey('code')) errorMsg += '[ ${error['code']?.toString() ?? ''} ]'; + if (error.containsKey('message')) errorMsg += '[ ${error['message']?.toString() ?? ''} ]'; + if (error.containsKey('details')) errorMsg += '[ ${error['details']?.toString() ?? ''} ]'; + UniApi.trackError('UniCallbackTestService', 'com.didi.flutter.uni_api.UniCallbackTestService.doCallbackAction2', 'doCallbackAction2: $errorMsg);'); + if (!kReleaseMode) { + throw PlatformException( + code: error['code'] as String, + message: error['message'] as String, + details: error['details'], + ); + } + } else { + // noop; + } + } + } diff --git a/packages/unify_uni_api/example/03_unicallback_demo/lib/uniapi/uni_callback_manager.dart b/packages/unify_uni_api/example/03_unicallback_demo/lib/uniapi/uni_callback_manager.dart index de6c152..008eb3c 100644 --- a/packages/unify_uni_api/example/03_unicallback_demo/lib/uniapi/uni_callback_manager.dart +++ b/packages/unify_uni_api/example/03_unicallback_demo/lib/uniapi/uni_callback_manager.dart @@ -1,5 +1,5 @@ // ================================================= -// Autogenerated from Unify 3.0.4, do not edit directly. +// Autogenerated from Unify 3.0.5, do not edit directly. // ================================================= import '../location_info_model.dart'; @@ -48,6 +48,11 @@ class UniCallbackManager { continue; } + if (callback.getType().toString() == 'void') { + callback.onEvent(data, disposable); + continue; + } + if (callback.getType() == bool) { (callback as UniCallback).onEvent(data as bool, disposable); continue; diff --git a/packages/unify_uni_api/lib/analyzer/visitors/base_ast_visitor.dart b/packages/unify_uni_api/lib/analyzer/visitors/base_ast_visitor.dart index 727e725..bafb131 100644 --- a/packages/unify_uni_api/lib/analyzer/visitors/base_ast_visitor.dart +++ b/packages/unify_uni_api/lib/analyzer/visitors/base_ast_visitor.dart @@ -27,4 +27,23 @@ class BaseAstVisitor extends dart_ast_visitor.RecursiveAstVisitor { bool isRequiredMessager(dart_ast.NodeList metadata) => hasMetadata(metadata, requiredMessagerAnnotation); + + bool hasUniBufferSize(dart_ast.NodeList metadata) => + hasMetadata(metadata, uniBufferSizeAnnotation); + + /// The integer argument of `@UniBufferSize(n)`. + /// + /// Returns the parsed value only when it is a plain positive integer literal; + /// otherwise returns `null` (missing annotation, missing/invalid argument, or + /// a non-positive value), so callers can warn and skip. + int? uniBufferSize(dart_ast.NodeList metadata) { + final anno = _findMetadata(metadata, uniBufferSizeAnnotation); + final args = anno?.arguments?.arguments; + if (args == null || args.isEmpty) return null; + final first = args.first; + if (first is! dart_ast.IntegerLiteral) return null; + final value = first.value; + if (value == null || value <= 0) return null; + return value; + } } diff --git a/packages/unify_uni_api/lib/analyzer/visitors/uniapi_ast_visitor.dart b/packages/unify_uni_api/lib/analyzer/visitors/uniapi_ast_visitor.dart index f3c70b6..5f91c61 100644 --- a/packages/unify_uni_api/lib/analyzer/visitors/uniapi_ast_visitor.dart +++ b/packages/unify_uni_api/lib/analyzer/visitors/uniapi_ast_visitor.dart @@ -62,6 +62,26 @@ class UniApiAstVisitor extends BaseAstVisitor { final name = node.name.lexeme; final ignoreError = isIgnoreError(node.metadata); + // '@UniBufferSize(n)' 场景:仅 UniFlutterModule(native -> dart)有效。 + // 未标注时 bufferSize 为 null,保持原有逻辑不变,不生成 resize。 + int? bufferSize; + if (hasUniBufferSize(node.metadata)) { + if (isRequiredMessager(node.metadata)) { + // @RequiredMessager 方法的目标 messenger 由每次调用决定,setup 内 resize + // 无法保证命中正确的引擎,这里跳过并告警。 + printf( + 'warning: @UniBufferSize on "$name" is ignored because the method is also annotated with @RequiredMessager.'); + } else { + final size = uniBufferSize(node.metadata); + if (size == null) { + printf( + 'warning: @UniBufferSize on "$name" is ignored: size must be a positive integer literal.'); + } else { + bufferSize = size; + } + } + } + final returnType = node.returnType!; final returnTypeIdentifier = @@ -100,7 +120,8 @@ class UniApiAstVisitor extends BaseAstVisitor { parameters: arguments, ignoreError: ignoreError, isAsync: isAsync, - codeComments: codeComments); + codeComments: codeComments, + bufferSize: bufferSize); if (_flutterModule != null) { _flutterModule!.methods.add(method); diff --git a/packages/unify_uni_api/lib/api/api.dart b/packages/unify_uni_api/lib/api/api.dart index 11cc125..977de04 100644 --- a/packages/unify_uni_api/lib/api/api.dart +++ b/packages/unify_uni_api/lib/api/api.dart @@ -21,3 +21,19 @@ class IgnoreError { class RequiredMessager { const RequiredMessager(); } + +/// Enlarge the platform channel buffer for the annotated method's channel. +/// +/// Only effective in "UniFlutterModule" mode (native -> dart). By default the +/// Flutter channel buffer keeps only 1 message; when native sends before the +/// Dart handler is registered, earlier messages are dropped. Annotating a +/// method makes the generated native `setup` enlarge that channel's buffer to +/// [size] so early messages are queued instead of discarded. +/// +/// [size] must be a positive integer literal. Methods without this annotation +/// keep the original behavior unchanged. It is ignored on `@RequiredMessager` +/// methods (their target messenger is decided per call, not at setup time). +class UniBufferSize { + final int size; + const UniBufferSize(this.size); +} diff --git a/packages/unify_uni_api/lib/ast/basic/ast_bool.dart b/packages/unify_uni_api/lib/ast/basic/ast_bool.dart index 179037e..f70ccbc 100644 --- a/packages/unify_uni_api/lib/ast/basic/ast_bool.dart +++ b/packages/unify_uni_api/lib/ast/basic/ast_bool.dart @@ -23,7 +23,8 @@ class AstBool extends AstType { } @override - String ocType({bool showGenerics = false}) => 'NSNumber'; + // 非空 bool 映射为标量 BOOL;可空 bool? 回退为 NSNumber。 + String ocType({bool showGenerics = false}) => maybeNull ? 'NSNumber' : 'BOOL'; @override String javaDefault() => 'false'; diff --git a/packages/unify_uni_api/lib/ast/basic/ast_double.dart b/packages/unify_uni_api/lib/ast/basic/ast_double.dart index c5a6e6b..7e3b253 100644 --- a/packages/unify_uni_api/lib/ast/basic/ast_double.dart +++ b/packages/unify_uni_api/lib/ast/basic/ast_double.dart @@ -26,7 +26,8 @@ class AstDouble extends AstType { } @override - String ocType({bool showGenerics = false}) => 'NSNumber'; + // 非空 double 映射为标量 double;可空 double? 回退为 NSNumber。 + String ocType({bool showGenerics = false}) => maybeNull ? 'NSNumber' : 'double'; @override String dartDefault() => '0.0'; diff --git a/packages/unify_uni_api/lib/ast/basic/ast_int.dart b/packages/unify_uni_api/lib/ast/basic/ast_int.dart index f7bf11a..ecfeac2 100644 --- a/packages/unify_uni_api/lib/ast/basic/ast_int.dart +++ b/packages/unify_uni_api/lib/ast/basic/ast_int.dart @@ -23,7 +23,9 @@ class AstInt extends AstType { } @override - String ocType({bool showGenerics = false}) => 'NSNumber'; + // 非空 int 映射为标量 NSInteger,与声明类型对齐; + // 可空 int? 回退为 NSNumber(标量无法表达 nil)。 + String ocType({bool showGenerics = false}) => maybeNull ? 'NSNumber' : 'NSInteger'; @override String javaDefault() => '0'; diff --git a/packages/unify_uni_api/lib/ast/basic/ast_list.dart b/packages/unify_uni_api/lib/ast/basic/ast_list.dart index 1df366b..58a885a 100644 --- a/packages/unify_uni_api/lib/ast/basic/ast_list.dart +++ b/packages/unify_uni_api/lib/ast/basic/ast_list.dart @@ -49,7 +49,7 @@ class AstList extends AstType { if (generics.isEmpty || !showGenerics) { return 'NSArray'; } - return 'NSArray<${OCReference(generics.first).build()}>'; + return 'NSArray<${OCReference(generics.first, boxed: true).build()}>'; } @override diff --git a/packages/unify_uni_api/lib/ast/basic/ast_map.dart b/packages/unify_uni_api/lib/ast/basic/ast_map.dart index ec9ea51..fd881fb 100644 --- a/packages/unify_uni_api/lib/ast/basic/ast_map.dart +++ b/packages/unify_uni_api/lib/ast/basic/ast_map.dart @@ -43,7 +43,7 @@ class AstMap extends AstType { if (!showGenerics) { return 'NSDictionary'; } - return 'NSDictionary<${OCReference(keyType).build()}, ${OCReference(valueType).build()}>'; + return 'NSDictionary<${OCReference(keyType, boxed: true).build()}, ${OCReference(valueType, boxed: true).build()}>'; } @override diff --git a/packages/unify_uni_api/lib/ast/uniapi/ast_method.dart b/packages/unify_uni_api/lib/ast/uniapi/ast_method.dart index 8052b9f..3774f10 100644 --- a/packages/unify_uni_api/lib/ast/uniapi/ast_method.dart +++ b/packages/unify_uni_api/lib/ast/uniapi/ast_method.dart @@ -10,6 +10,7 @@ class Method extends UniApiNode { this.ignoreError = false, this.isAsync = false, this.codeComments = const [], + this.bufferSize, }); Method.copy(Method method) @@ -18,7 +19,8 @@ class Method extends UniApiNode { parameters = method.parameters, ignoreError = method.ignoreError, codeComments = method.codeComments, - isAsync = method.isAsync; + isAsync = method.isAsync, + bufferSize = method.bufferSize; String name; @@ -31,4 +33,10 @@ class Method extends UniApiNode { bool isAsync; List codeComments; + + /// Channel buffer size declared via `@UniBufferSize(n)`. + /// + /// `null` means no annotation was present, in which case the original + /// behavior is kept unchanged (no resize is generated). + int? bufferSize; } diff --git a/packages/unify_uni_api/lib/generator/module_flutter.dart b/packages/unify_uni_api/lib/generator/module_flutter.dart index 52855f6..97722e6 100644 --- a/packages/unify_uni_api/lib/generator/module_flutter.dart +++ b/packages/unify_uni_api/lib/generator/module_flutter.dart @@ -79,7 +79,14 @@ abstract class FlutterModuleGenerator { OneLine( depth: depth + 1, body: - '${options.javaUniAPIPrefix}$kUniAPI.registerModule(this);') + '${options.javaUniAPIPrefix}$kUniAPI.registerModule(this);'), + // @UniBufferSize:仅为标注的 channel 扩大缓冲区。 + ...module.methods + .where((method) => method.bufferSize != null) + .map((method) => OneLine( + depth: depth + 1, + body: + 'new BasicMessageChannel<>(messenger, "${makeChannelName(module, method)}", new StandardMessageCodec()).resizeChannelBuffer(${method.bufferSize});')) ]), EmptyLine(), JavaClass( @@ -274,6 +281,16 @@ abstract class FlutterModuleGenerator { ret.add(OneLine( depth: depth + 1, body: '[[self instance] setBinaryMessenger:binaryMessenger];')); + // @UniBufferSize:仅为标注的 channel 扩大缓冲区,未标注方法不生成任何代码。 + for (final method in module.methods) { + if (method.bufferSize == null) { + continue; + } + ret.add(OneLine( + depth: depth + 1, + body: + '[[FlutterBasicMessageChannel messageChannelWithName:@"${makeChannelName(module, method)}" binaryMessenger:binaryMessenger] resizeChannelBuffer:${method.bufferSize}];')); + } ret.add(OneLine(depth: depth, body: '}')); // 对每个模块方法进行封装 @@ -341,7 +358,7 @@ abstract class FlutterModuleGenerator { funcBody.add(OneLine( depth: depth + 2, body: - 'if (reply && result) result(${method.returnType.realType().convertOcJson2Obj(vname: 'reply')});')); + 'if (reply && result) result(${method.returnType.realType().convertOcJson2Obj(vname: 'reply', asObject: true)});')); funcBody.add(OneLine(depth: depth + 1, body: '}];')); } diff --git a/packages/unify_uni_api/lib/generator/widgets/lang/oc/oc_class.dart b/packages/unify_uni_api/lib/generator/widgets/lang/oc/oc_class.dart index fb9d2d6..f8537f4 100644 --- a/packages/unify_uni_api/lib/generator/widgets/lang/oc/oc_class.dart +++ b/packages/unify_uni_api/lib/generator/widgets/lang/oc/oc_class.dart @@ -1,6 +1,9 @@ import 'package:unify_flutter/analyzer/analyzer_lib.dart'; import 'package:unify_flutter/ast/base.dart'; +import 'package:unify_flutter/ast/basic/ast_bool.dart'; import 'package:unify_flutter/ast/basic/ast_custom.dart'; +import 'package:unify_flutter/ast/basic/ast_double.dart'; +import 'package:unify_flutter/ast/basic/ast_int.dart'; import 'package:unify_flutter/ast/basic/ast_string.dart'; import 'package:unify_flutter/ast/basic/ast_variable.dart'; import 'package:unify_flutter/ast/basic/ast_void.dart'; @@ -291,10 +294,17 @@ class OCClassUniCallback { body: 'NSDictionary *msg = @{@"callbackName":self.callbackName,@"data" : @""};')); } else { + // 非空基础类型(BOOL/NSInteger/double)是标量,不能直接作为 + // NSDictionary 的 value,需装箱成 NSNumber;其余对象类型保持原样。 + final rt = paramGeneric.realType(); + final dataValue = (!rt.maybeNull && + (rt is AstInt || rt is AstDouble || rt is AstBool)) + ? '@($paramName)' + : paramName; ret.add(OneLine( depth: depth + 1, body: - 'NSDictionary *msg = @{@"callbackName":self.callbackName,@"data":$paramName};')); + 'NSDictionary *msg = @{@"callbackName":self.callbackName,@"data":$dataValue};')); } ret.add(Comment(depth: depth + 1, comments: ['发送消息'])); ret.add(OneLine( diff --git a/packages/unify_uni_api/lib/generator/widgets/lang/oc/oc_reference.dart b/packages/unify_uni_api/lib/generator/widgets/lang/oc/oc_reference.dart index 2f175b9..2e6d7e8 100644 --- a/packages/unify_uni_api/lib/generator/widgets/lang/oc/oc_reference.dart +++ b/packages/unify_uni_api/lib/generator/widgets/lang/oc/oc_reference.dart @@ -1,15 +1,23 @@ import 'package:unify_flutter/ast/base.dart'; +import 'package:unify_flutter/ast/basic/ast_bool.dart'; +import 'package:unify_flutter/ast/basic/ast_double.dart'; +import 'package:unify_flutter/ast/basic/ast_int.dart'; import 'package:unify_flutter/generator/widgets/code_unit.dart'; /// 传入 AST 类型,由组件白名单决定是直接引用还是指针引用 class OCReference extends CodeUnit { - OCReference(this.type, {int depth = 0, this.keepRaw = false}) : super(depth); + OCReference(this.type, + {int depth = 0, this.keepRaw = false, this.boxed = false}) + : super(depth); static const directReferenceMap = { 'NSInteger', 'Class', 'int', 'long', + 'double', // 非空 double 直接引用,不加 '*' + 'float', + 'BOOL', // 非空 bool 直接引用,不加 '*' 'id', 'void', 'UniCompleted', // 这是一个 block @@ -19,12 +27,23 @@ class OCReference extends CodeUnit { bool keepRaw; + /// 处于泛型实参位置(如 NSArray<...> / NSDictionary<...,...>)。 + /// OC 集合泛型必须是对象类型,非空标量需回退为 NSNumber*。 + bool boxed; + @override String build() { if (keepRaw) { return type.ocType(); } + if (boxed) { + final rt = type.realType(); + if (rt is AstInt || rt is AstDouble || rt is AstBool) { + return 'NSNumber*'; + } + } + // 比较的时候用 ocTypeWithoutGeneric,输出的时候还是用 ocType final ocType = type.ocType(showGenerics: true); var ocTypeWithoutGeneric = ocType; diff --git a/packages/unify_uni_api/lib/utils/constants.dart b/packages/unify_uni_api/lib/utils/constants.dart index f51b81d..e2b0984 100644 --- a/packages/unify_uni_api/lib/utils/constants.dart +++ b/packages/unify_uni_api/lib/utils/constants.dart @@ -40,6 +40,7 @@ const uniFlutterModuleAnnotation = 'UniFlutterModule'; const uniModelAnnotation = 'UniModel'; const ignoreErrorAnnotation = 'IgnoreError'; const requiredMessagerAnnotation = 'RequiredMessager'; +const uniBufferSizeAnnotation = 'UniBufferSize'; /// Default buid-in type const typeUniCallbackManager = 'UniCallbackManager'; diff --git a/packages/unify_uni_api/lib/utils/extension/ast_extension.dart b/packages/unify_uni_api/lib/utils/extension/ast_extension.dart index c274ac9..9612eed 100644 --- a/packages/unify_uni_api/lib/utils/extension/ast_extension.dart +++ b/packages/unify_uni_api/lib/utils/extension/ast_extension.dart @@ -1,5 +1,7 @@ import 'package:unify_flutter/ast/base.dart'; +import 'package:unify_flutter/ast/basic/ast_bool.dart'; import 'package:unify_flutter/ast/basic/ast_custom.dart'; +import 'package:unify_flutter/ast/basic/ast_double.dart'; import 'package:unify_flutter/ast/basic/ast_int.dart'; import 'package:unify_flutter/ast/basic/ast_list.dart'; import 'package:unify_flutter/ast/basic/ast_map.dart'; @@ -189,8 +191,20 @@ extension AstTypeExtension on AstType { return valueName; } - String? convertOcJson2Obj({String vname = '[message objectForKey:@"data"]'}) { + String? convertOcJson2Obj( + {String vname = '[message objectForKey:@"data"]', bool asObject = false}) { if (containsCustomType() == false) { + // Channel 传来的数字/布尔被 StandardMessageCodec 装箱成 NSNumber, + // 非空标量类型需从 NSNumber 拆箱回标量,与 ocType() 的映射保持一致。 + // + // 但当目标是 id(如 UniCompleted 回调、wrapNil 的 id 入参)时,不能塞标量, + // 此时 asObject=true,直接沿用 channel 传来的 NSNumber,不拆箱。 + final rt = realType(); + if (!asObject && !rt.maybeNull) { + if (rt is AstInt) return '[$vname integerValue]'; + if (rt is AstDouble) return '[$vname doubleValue]'; + if (rt is AstBool) return '[$vname boolValue]'; + } return vname; } @@ -224,9 +238,14 @@ extension AstTypeExtension on AstType { } } - if (realType() is AstVoid) { + final rt = realType(); + if (rt is AstVoid) { return 'nil'; } + // 非空标量返回值/字段需装箱成 NSNumber,才能放入回传的 NSDictionary。 + if (!rt.maybeNull && (rt is AstInt || rt is AstDouble || rt is AstBool)) { + return '@($valueName)'; + } return valueName; } } diff --git a/packages/unify_uni_api/lib/version.dart b/packages/unify_uni_api/lib/version.dart index f3b64f9..57409d8 100644 --- a/packages/unify_uni_api/lib/version.dart +++ b/packages/unify_uni_api/lib/version.dart @@ -1 +1 @@ -const packageVersion = '3.0.5'; +const packageVersion = '3.0.6'; diff --git a/packages/unify_uni_api/pubspec.yaml b/packages/unify_uni_api/pubspec.yaml index 998692c..d68accf 100644 --- a/packages/unify_uni_api/pubspec.yaml +++ b/packages/unify_uni_api/pubspec.yaml @@ -1,6 +1,6 @@ name: unify_flutter description: An efficient, flexible Flutter-Native hybrid communication framework for seamless module integration and automatic code generation. -version: 3.0.5 +version: 3.0.6 homepage: https://github.com/didi/Unify environment: