Práctica de desarrollo de Flutter: MethodChannel realiza una comunicación bidireccional entre flutter y Android nativo

Práctica de desarrollo de Flutter: MethodChannel realiza una comunicación bidireccional entre flutter y Android nativo

En el desarrollo reciente, Android nativo y flutter necesitan comunicarse, y el MethodChannel utilizado aquí

1. Canal de método

MethodChannel: se utiliza para pasar llamadas a métodos (invocación de método).
Los extremos del cliente y del host de un canal están conectados a través del nombre del canal pasado al constructor del canal.

Todos los nombres de canales utilizados en una aplicación deben ser
nombres de canales de prefijo únicos con un prefijo de dominio único, por ejemplo: samples.flutter.dev/battery

Sitio web oficial https://flutter.cn/docs/development/platform-integration/platform-channels

https://blog.csdn.net/gloryFlow/article/details/132218837

2. Implementar MethodChannel en el lado del aleteo

Necesitamos crear un canal llamado "samples.flutter.dev/test".
Realizado por invokeNativeMethod y setMethodCallHandler

  • invokeNativeMethod: llama al código en el lado de Android
  • setMethodCallHandler: configura la devolución de llamada del método para recibir parámetros en el lado de Android

El código se muestra a continuación.

import 'package:flutter/services.dart';

//MethodChannel
const methodChannel = const MethodChannel('samples.flutter.dev/test');

class FlutterMethodChannel {
    
    
  /*
 * MethodChannel
 * 在方法通道上调用方法invokeMethod
 * methodName 方法名称
 * params 发送给原生的参数
 * return数据 原生发给Flutter的参数
 */
  static Future<Map> invokeNativeMethod(String methodName,
      [Map? params]) async {
    
    
    var res;
    try {
    
    
      if (params == null) {
    
    
        res = await methodChannel.invokeMethod('$methodName');
      } else {
    
    
        res = await methodChannel.invokeMethod('$methodName', params);
      }
    } catch (e) {
    
    
      res = {
    
    'Failed': e.toString()};
    }
    return res;
  }

  /*
 * MethodChannel
 * 接收methodHandler
 * methodName 方法名称
 * params 发送给原生的参数
 * return数据 原生发给Flutter的参数
 */
  static void methodHandlerListener(Future<dynamic> Function(MethodCall call)? handler) {
    
    
    methodChannel.setMethodCallHandler(handler);
  }
}

使用该MethodChannel,我们需要使用MethodChannel
使用代码如下

  
  void initState() {
    
    
    // TODO: implement initState
    super.initState();

    setMethodHandle();
  }

  void setMethodHandle() {
    
    
    FlutterMethodChannel.methodHandlerListener((call) {
    
    
      print("methodHandlerListener call:${
      
      call.toString()}");
      if ("methodToFlutter" == call.method) {
    
    
        print("methodToFlutter arg:${
      
      call.arguments}");
      }
      return Future.value("message from flutter");
    });
  }

  Future<void> invokeNativeMethod() async {
    
    
    var result = await FlutterMethodChannel.invokeNativeMethod("methodTest", {
    
    "param":"params from flutter"});
    print("invokeNativeMethod result:${
      
      result.toString()}");
  }

  void testButtonTouched() {
    
    
    invokeNativeMethod();
  }

  
  void dispose() {
    
    
    // TODO: implement dispose
    super.dispose();
  }

Aquí hemos procesado el método métodoToFlutter para recibir la llamada de paso de parámetros desde el lado de Android y, después del procesamiento, devolveremos el resultado "mensaje de flutter" al lado de Android.
Llamamos al método MethodTest en el lado de Android y pasamos parámetros para obtener los resultados devueltos por el lado de Android.

3. MainActivity en el lado de Android

En MainActivity de Android, también implementamos el
método MethodChannel para configurar setMethodCallHandler y llamar a Flutter.

El código se muestra a continuación.

import android.util.Log;

import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.plugin.common.MethodChannel;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends FlutterActivity {
    
    
    private MethodChannel methodChannel;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        getMethodChannel().setMethodCallHandler((call, result) -> {
    
    
            if (TextUtils.equals(call.method, "methodTest")) {
    
    
                result.success("message from Android");
            } else {
    
    
                result.error("1", "Illegal Argument Exception", "Unsupported Method - " + call.method);
            }
        });

        new Timer().schedule(new TimerTask() {
    
    
            @Override
            public void run() {
    
    
                runOnUiThread(() -> {
    
    
                    getMethodChannel().invokeMethod("methodToFlutter", "Params from Android");
                });
            }
        }, 10 * 1000);
    }

    private MethodChannel getMethodChannel() {
    
    
        if (methodChannel == null) {
    
    
            methodChannel = new MethodChannel(getFlutterEngine().getDartExecutor(), "samples.flutter.dev/test");
        }
        return methodChannel;
    }
}

Pasamos los parámetros al lado de Flutter llamando al método métodoToFlutter en MainActivity de Android. Configure setMethodCallHandler para procesar y recibir parámetros de flutter de acuerdo con el método métodoTest y devolver el resultado a flutter después del procesamiento.

Nota: La llamada al temporizador en MainActivity debe realizarse en el hilo principal, que puede ser manejado por runOnUiThread.

Cuatro Resumen

Práctica de desarrollo de Flutter: MethodChannel realiza una comunicación bidireccional entre Flutter y Android nativo. Implemente la función de comunicación mutua entre MethodChannel en el lado de flutter y MainActivity en el lado de Android.

Registros de aprendizaje, sigue mejorando cada día.

Supongo que te gusta

Origin blog.csdn.net/gloryFlow/article/details/132218837
Recomendado
Clasificación