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 간의 상호 통신 기능을 구현합니다.
학습 기록, 매일 계속 향상됩니다.