Flutter端
- 导入依赖:在
pubspec.yaml
文件中确保flutter
库已引入,通常默认包含。
- 创建MethodChannel:在Flutter代码中创建
MethodChannel
实例,指定通道名称,该名称需与Android端一致。
import 'package:flutter/services.dart';
const platform = MethodChannel('com.example.flutter_native_channel');
- 调用原生方法:使用
invokeMethod
方法调用Android端暴露的方法,并可传递参数。
try {
final String result = await platform.invokeMethod('getPlatformVersion');
print('来自原生的结果: $result');
} on PlatformException catch (e) {
print("调用原生方法出错: ${e.message}");
}
- 接收原生调用:注册一个方法处理程序,处理来自Android端的调用。
platform.setMethodCallHandler((call) async {
if (call.method == 'flutterMethod') {
// 处理来自原生的调用
return 'Flutter处理结果';
}
throw PlatformException(code: 'Unimplemented', message: '该方法未实现');
});
Android端
- 导入依赖:在
app/build.gradle
文件中确保flutter
相关依赖已配置。
dependencies {
implementation "io.flutter:flutter_embedding_v2_release:1.0.0"
}
- 创建MethodChannel:在Android代码中创建
MethodChannel
实例,指定与Flutter端相同的通道名称。
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "com.example.flutter_native_channel";
@Override
public void configureFlutterEngine(FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
.setMethodCallHandler(
(call, result) -> {
if (call.method.equals("getPlatformVersion")) {
String platformVersion = "Android " + android.os.Build.VERSION.RELEASE;
result.success(platformVersion);
} else {
result.notImplemented();
}
}
);
}
}
- 调用Flutter方法:通过
MethodChannel
的invokeMethod
方法调用Flutter端暴露的方法。
MethodChannel channel = new MethodChannel(getFlutterEngine().getDartExecutor().getBinaryMessenger(), CHANNEL);
channel.invokeMethod("flutterMethod", null, new MethodChannel.Result() {
@Override
public void success(Object o) {
Log.d("Native", "Flutter返回结果: " + o);
}
@Override
public void error(String s, String s1, Object o) {
Log.e("Native", "调用Flutter方法出错: " + s1);
}
@Override
public void notImplemented() {
Log.e("Native", "该方法未实现");
}
});