Flutter调用原生方法时MethodChannel返回null怎么办?
我在用Flutter的MethodChannel调用Android原生代码,结果总是返回null,明明原生那边已经return了字符串,但Dart这边拿到的是null,这是为啥?
我注册的channel名字两边都确认是一样的,也加了setMethodCallHandler,但就是收不到正确返回值。试过Log打印原生那边确实执行了,但Dart端result.success()好像没生效。
public class MainActivity extends FlutterActivity {
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "my_channel")
.setMethodCallHandler((call, result) -> {
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + Build.VERSION.RELEASE);
} else {
result.notImplemented();
}
});
}
}
如果还不行,试试在flutter端用await调用,可能异步问题。
await等待异步结果,二是MethodChannel实例没在全局或静态地方保存,导致被 GC 掉了。先看 Dart 端是不是这样写的:
如果没
await,方法直接返回Future,Dart 层拿到的就是null,因为还没执行完就结束了。另一个关键点:每次调用都 new MethodChannel('my_channel') 是危险的,尤其在热重载或多次调用时,Channel 可能被重复注册或销毁。建议把 channel 提到全局:
还有个容易忽略的点:你用的是
FlutterActivity,但如果你项目里用了FlutterFragment或FlutterView,那configureFlutterEngine可能没被调用到,导致 handler 根本没注册上。这种情况得在FlutterActivity的子类里重写onCreate并手动 setup engine,或者更稳妥点——直接用FlutterFragment的方式注入 channel,或者升级到 Flutter 3.x 后推荐的FlutterEngineCache方式。如果确认 engine 注册没问题,原生 log 也打印了,那大概率是 Dart 端没 await 或 channel 实例生命周期不对。你可以加个 try-catch 包一下,看是不是抛异常被吞了:
我之前就踩过一次坑——Dart 里写了
then但没 catch 异常,原生 return 了字符串,结果 Dart 里收到的是Instance of Future,看着像 null。加了 await 才好。总之先检查 Dart 端是不是 async/await 用对了,再确认 channel 实例别每次 new,大概率能解决。