Flutter如何和Native通信-Android视角,深度剖析原理
在Flutter与Android原生之间进行通信,主要是通过MethodChannel
实现。以下是实现这种通信的基本步骤:
- 在Flutter端定义通信的channel。
- 在Flutter端调用channel的
invokeMethod
方法发送方法调用。 - 在Android原生端的对应Activity或Fragment中设置
MethodChannel.MethodCallHandler
以处理来自Flutter的调用。 - 使用
MethodChannel.result.success
或MethodChannel.result.error
回调结果或错误给Flutter。
Flutter端示例代码:
import 'package:flutter/services.dart';
const platform = MethodChannel('samples.flutter.dev/battery');
// 发送方法调用并接收结果
Future<void> getBatteryLevel() async {
String batteryLevel;
try {
final int result = await platform.invokeMethod('getBatteryLevel');
batteryLevel = 'Battery level at $result% .';
} on PlatformException catch (e) {
batteryLevel = "Failed to get battery level: '${e.message}'.";
}
// 使用batteryLevel进行后续操作
}
Android原生端示例代码:
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import android.os.Bundle;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "samples.flutter.dev/battery";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, MethodChannel.Result result) {
if (call.method.equals("getBatteryLevel")) {
int batteryLevel = getBatteryLevel();
if (batteryLevel != -1) {
result.success(batteryLevel);
} else {
result.error("UNAVAILABLE", "Battery level not available.", null);
}
} else {
result.notImplemented();
}
}
}
);
}
private int getBatteryLevel() {
// 实现获取电池电量的逻辑
return someBatteryLevel;
}
}
在这个例子中,Flutter端通过MethodChannel
向Android原生端发送了一个名为getBatteryLevel
的方法调用,然后Android原生端在其对应的Activity中设置了MethodChannel.MethodCallHandler
来处理这个调用,并返回了一个模拟的电池电量值。这个过程展示了如何在Flutter和Android原生之间建立单向通信,并在需要时实现双向通信。
评论已关闭