1. flutter_boost
Hinweis: Flutter-Code, flutter_boost-Kommunikation erfordert, dass der folgende „Senden/Empfangen“-Code in die für flutter_boost registrierte Seite geschrieben wird
//routeFactory ist auf der flutter_boost-Seite registriert @override Widget-Build(BuildContext-Kontext) { return FlutterBoostApp( routeFactory, appBuilder: appBuilder, ); } |
1.iOS
schicken
[[FlutterBoost-Instanz] sendEventToFlutterWith:@"event_to_flutter" arguments:@{@"tfs": tfsKey,@"key":@"loadPic"}]; |
übernehmen
[[FlutterBoost-Instanz] addEventListener:^(NSString *name, NSDictionary *arguments) { if (![name isEqualToString:@"event_to_native"]) { zurück; } NSString *key=arguments[@"key"]; } forName:@"event_to_native"]; |
2.flattern
schicken
BoostChannel.instance.sendEventToNative("event_to_native", {"key":"loadPic"}); |
übernehmen
spätes VoidCallback removeListener;
String filePath = "";
@override void initState() { super.initState(); removeListener = BoostChannel.instance.addEventListener("event_to_flutter", (key, arguments) {
if(arguments.isNotEmpty && arguments['key'] == "loadPic") { setState(() { filePath = getTFSUrl(arguments['tfs']); }); } return Future<dynamic>(() => null); }); }
@override void dispose() { super.dispose(); removeListener.call(); } |
2. MethodeKanal
1.iOS
schicken
FlutterMethodChannel *methodChannel = [FlutterMethodChannel methodChannelWithName:@"native_send_message_to_flutter" BinaryMessenger:[[[FlutterBoost-Instanz] Engine] BinaryMessenger]]; [methodChannel invokeMethod:@"will_logout" Argumente: Null]; |
übernehmen
|
2.flattern
schicken
|
Der Empfangscode muss nach runApp geschrieben werden, andernfalls muss WidgetsFlutterBinding.ensureInitialized() hinzugefügt werden, bevor der Empfangscode hinzugefügt wird. Einige notwendige Bindungen sollten initialisiert werden, bevor der Empfangscode wirksam werden kann.
übernehmen
final MethodChannel _nativeSendMessageChannel = const MethodChannel('native_send_message_to_flutter');< /span> _nativeSendMessageChannel.setMethodCallHandler((call) async { debugPrint('flutter _MyBoostAppState _nativeSendMessageChannel = ${call.method}'); if (call.method == 'will_logout') { SecurityRepository().reset(); } }); |
3. EventChannel
Wichtiger Punkt: SetStreamHandler ähnelt dem Festlegen eines Proxy-Objekts. Daher muss der native EventChannel im Voraus festgelegt werden, bevor Flutter den Empfangscode hinzufügt. Andernfalls wird die Ausführung der FlutterStreamHandler-Proxy-Rückruffunktion nicht ausgelöst, wenn Flutter den Empfangscode ausführt , ergebend
Wenn eventSink null ist, kann Native die Sendeaufgabe nicht ausführen.
iOS:
schicken
@interface XXXXX() <FlutterStreamHandler> @property (nichtatomar, stark) FlutterEventSink eventSink; @Ende
//aufstellen -(void)setEventChannel{ FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:@"native_eventChannel_send_message_to_flutter" BinaryMessenger:[[[FlutterBoost-Instanz] Engine] BinaryMessenger]]; [eventChannel setStreamHandler:self];//ähnlich dem Proxy }
//Die von native an Flatter gesendeten Daten -(void)sendEventChannelMessage:(NSDictionary *)dic{ if (self.eventSink) { self.eventSink(dic); } }
#pragma mark - FlutterStreamHandler - (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments eventSink:(FlutterEventSink)eventSink { self.eventSink = eventSink; return nil; }
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments { self.eventSink = nil; return nil; }
|
flutter
接收
@override void initState() { // TODO: implement initState super.initState();
const EventChannel eventChannel = EventChannel('native_eventChannel_send_message_to_flutter'); eventChannel.receiveBroadcastStream().listen(_onEvent,onError: _onError); } // 数据接收 void _onEvent(dynamic value) { debugPrint("flutter_jl_bluetooth_plugin_event _onEvent: $value"); } // 数据接收: 错误处理 static void _onError(dynamic value) { debugPrint("flutter_jl_bluetooth_plugin_event _onError: $value"); } |