Flutter 개발 실습 - MethodChannel은 Flutter와 기본 Android 간의 양방향 통신을 구현합니다.

Flutter 개발 실습 - MethodChannel은 Flutter와 기본 Android 간의 양방향 통신을 구현합니다.

최근 개발에서는 네이티브 Android와 Flutter가 통신해야 하며 여기서는 MethodChannel을 사용합니다.

1. 메소드채널

MethodChannel: 메소드 호출(메소드 호출)을 전달하는 데 사용됩니다.
채널의 클라이언트와 호스트 끝은 채널 생성자에 전달된 채널 이름을 통해 연결됩니다.

애플리케이션에 사용되는 모든 채널 이름은 고유
한 도메인 접두사가 있는 고유한 접두사 채널 이름이어야 합니다(예: Samples.flutter.dev/battery).

공식 웹사이트 https://flutter.cn/docs/development/platform-integration/platform-channels

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

2. Flutter 측에 MethodChannel 구현

"samples.flutter.dev/test"라는 채널을 만들어야 합니다.
InvokeNativeMethod 및 setMethodCallHandler로 구현됨

  • 호출NativeMethod: Android 측에서 코드를 호출합니다.
  • setMethodCallHandler: Android 측에서 매개변수를 수신하도록 메소드 콜백을 설정합니다.

코드는 아래와 같이 표시됩니다.

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();
  }

여기서는 methodToFlutter 메소드를 처리하여 Android 측에서 호출을 전달하는 매개변수를 수신하고, 처리 후 "flutter에서 보낸 메시지" 결과를 Android 측에 반환합니다.
Android 측에서 methodTest 메서드를 호출하고 매개변수를 전달하여 Android 측에서 반환된 결과를 얻습니다.

3. 안드로이드 측 MainActivity

Android의 MainActivity에서는
setMethodCallHandler를 설정하고 Flutter를 호출하는 MethodChannel 메서드 도 구현했습니다.

코드는 아래와 같이 표시됩니다.

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;
    }
}

Android의 MainActivity에서 methodToFlutter 메서드를 호출하여 매개변수를 Flutter 측에 전달합니다. methodTest 메서드에 따라 flutter에서 매개변수를 처리하고 수신하도록 setMethodCallHandler를 설정하고, 처리 후 결과를 flutter에 반환합니다.

참고: MainActivity에서 타이머 호출은 runOnUiThread에 의해 처리될 수 있는 메인 스레드에서 호출되어야 합니다.

4. 요약

Flutter 개발 실습 - MethodChannel은 Flutter와 기본 Android 간의 양방향 통신을 구현합니다. Flutter 측의 MethodChannel과 Android 측의 MainActivity 간의 상호 통신 기능을 구현합니다.

학습 기록, 매일 계속 향상됩니다.

おすすめ

転載: blog.csdn.net/gloryFlow/article/details/132218837