Lors de l’écriture d’un plug-in Flutter, cela implique des rappels de résultats et des rappels de progression. Vous pouvez choisir d'utiliser PlatformChannel, BlockCallback ou FlutterEventChannel. Parlons brièvement de leurs scénarios d'utilisation.
1、PlatformChannel
PlatformChannel
C'est le pont de communication entre Flutter et la plateforme native. Grâce à PlatformChannel, l'API Flutter应用程序
peut être appelée 原生平台
et la plate-forme native peut également envoyer des messages à l'application Flutter. Dans le scénario de rappel de données, vous pouvez utiliser PlatformChannel
la registerMethodCallBack
méthode pour enregistrer une fonction de rappel, qui sera déclenchée lorsqu'une méthode spécifique est appelée sur la plateforme native. L'utilisation de PlatformChannel nécessite une gestion manuelle de la conversion des données entre la plateforme native et Flutter.
Avantages : N'importe quelle méthode de la plateforme native peut être appelée, et il existe différentes méthodes de communication, notamment asynchrones et synchrones.
Inconvénients : la conversion des données et le rappel doivent être gérés manuellement et le code est fastidieux.
2、FlutterEventChannel
FlutterEventChannel
est une 事件流处理
méthode spécifiquement utilisée pour . Il utilise l'architecture Stream de Flutter, qui peut 原生平台
envoyer des données de à à via Stream Flutter应用程序
. Dans le plug-in Flutter, vous pouvez utiliser FlutterEventChannel pour définir l'interface du flux d'événements, et la plateforme native envoie des événements à l'application Flutter via cette interface.
Avantages : Prend en charge le traitement des flux d'événements asynchrones, n'a pas besoin de traiter manuellement la conversion et le rappel des données et peut utiliser la bibliothèque de traitement Stream de Dart pour le traitement et la conversion des données.
Inconvénients : Vous devez être familier avec l'architecture et l'utilisation de Flutter.
3、BlockCallback
BlockCallback
Il s'agit d'une méthode de rappel simple, utilisant une fonction comme paramètre de rappel. Dans le plugin Flutter, BlockCallback peut être utilisé pour définir les méthodes que la plateforme native doit appeler. Les paramètres et la valeur de retour de cette méthode sont des types de plateforme natifs et peuvent être utilisés directement dans les applications Flutter.
Avantages : Simple à utiliser, pas besoin de gérer manuellement la conversion des données et les rappels.
Inconvénients : Seule la communication synchrone peut être utilisée, ce qui n'est pas adapté au traitement de grandes quantités de données ou nécessite un traitement asynchrone.
4. Résumé
En résumé, PlatformChannel
il convient aux situations où n'importe quelle méthode de la plateforme native doit être appelée et peut communiquer de manière asynchrone ou synchrone ; il convient BlockCallback
aux situations simples et il peut communiquer de manière synchrone ; il FlutterEventChannel
convient pour les situations nécessitant le traitement d'une grande quantité de données ou nécessitant un traitement asynchrone, en utilisant un flux d'événements asynchrone pour le traitement. Choisissez la méthode appropriée en fonction de vos besoins spécifiques.
5. L'utilisation de FlutterEventChannel (version Object_C)
registerWithRegistrar
Ajoutez le canal dans la méthode plug-in , comme suit :
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
// 方法回调
FlutterMethodChannel *channel = [FlutterMethodChannel
methodChannelWithName:@"DemoPlugin"
binaryMessenger:[registrar messenger]];
// 通道1
FlutterEventChannel *eventChannel1 = [FlutterEventChannel
eventChannelWithName:"eventChannel1"
binaryMessenger:[registrar messenger]];
// 通道2
FlutterEventChannel *eventChannel2 = [FlutterEventChannel
eventChannelWithName:"eventChannel2"
binaryMessenger:[registrar messenger]];
// 通道3
FlutterEventChannel *eventChannel3 = [FlutterEventChannel
eventChannelWithName:"eventChannel3"
binaryMessenger:[registrar messenger]];
DemoPlugin *instance = [[DemoPlugin alloc] init];
[registrar addMethodCallDelegate:instance channel:channel];
[eventChannel1 setStreamHandler:instance];
[eventChannel2 setStreamHandler:instance];
[eventChannel3 setStreamHandler:instance];
}
Lorsque Flutter
le client crée et détruit des canaux, il entrera automatiquement dans iOS
le proxy suivant :
// flutter创建通道/开启通道
- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events {
NSString *channelName = [NSString stringWithFormat:@"%@", arguments];
if([channelName isEqualToString:@"eventChannel1"]){
self.eventSink1 = events;
}else if([channelName isEqualToString:2"eventChannel2"]){
self.eventSink2 = events;
}else if([channelName isEqualToString:@"eventChannel3"]){
self.eventSink3 = events;
}
return nil;
}
// flutter关闭通道/销毁通道
- (FlutterError *)onCancelWithArguments:(id)arguments {
NSString *channelName = [NSString stringWithFormat:@"%@", arguments];
if([channelName isEqualToString:@"eventChannel1"]){
self.eventSink1 = nil;
}else if([channelName isEqualToString:2"eventChannel2"]){
self.eventSink2 = nil;
}else if([channelName isEqualToString:@"eventChannel3"]){
self.eventSink3 = nil;
}
return nil;
}
Démo de retour :
if(self.eventSink1 != nil){
self.eventSink1("demo1");
}
À ce stade, tout le travail côté iOS est terminé.
6. Utilisation de FlutterEventChannel (version flutter)
6.1. Créer une chaîne
// 创建一个事件通道
EventChannel eventChannel1 = EventChannel('eventChannel1');
6.2. Ouvrez le canal, c'est-à-dire commencez à surveiller les informations renvoyées
Appelez la méthode suivante et le côté iOS déclenchera automatiquement onListenWithArguments
l'agent pour terminer l'ouverture du canal. Ici, vous devez receiveBroadcastStream()
ajouter un paramètre pour distinguer lequel est le canal actuel.
// 监听来自原生端的事件流
late StreamSubscription streamSubscription1 = = eventChannel1.receiveBroadcastStream("eventChannel1").listen((event) {
});;
Ici, nous devons expliquer pourquoi le canal est créé 'eventChannel1'
et le flux d'événements est surveillé 'eventChannel1'
.
-
1. Dans la version 6.1,
'eventChannel1'
la création du canal est terminée et doit être cohérente avec le nom du canal dans le plug-in. -
2. Celui de 6.2 est
'eventChannel1'
la surveillance du flux d'événements. Comme il existe plusieurs canaux, lorsque le côté iOS reçoitonListenWithArguments
le rappel, il ne peut pas savoir quel canal est créé, il doit donc êtrereceiveBroadcastStream("eventChannel1")
réécrit ici'eventChannel1'
, afin que iOS puisse juger lequel la chaîne fonctionne actuellement/fermée.
Bien entendu, les paramètres ici dans le flux d'événements peuvent également être renommés pour les distinguer du nom de la chaîne, en fonction de vos préférences.
6.3 Fermeture du canal
Appelez la méthode suivante et le côté iOS déclenchera automatiquement onCancelWithArguments
l'agent pour terminer la destruction du canal.
streamSubscription1.cancel();