Rappel de données du plugin Flutter

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

PlatformChannelC'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 PlatformChannella registerMethodCallBackmé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

FlutterEventChannelest 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

BlockCallbackIl 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é, PlatformChannelil 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 BlockCallbackaux situations simples et il peut communiquer de manière synchrone ; il FlutterEventChannelconvient 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)

registerWithRegistrarAjoutez 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 Flutterle client crée et détruit des canaux, il entrera automatiquement dans iOSle 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 onListenWithArgumentsl'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çoit onListenWithArgumentsle rappel, il ne peut pas savoir quel canal est créé, il doit donc être receiveBroadcastStream("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 onCancelWithArgumentsl'agent pour terminer la destruction du canal.

streamSubscription1.cancel();

Acho que você gosta

Origin blog.csdn.net/king6188/article/details/131892369
Recomendado
Clasificación