Flutter Platform Channel在Android回调方法未触发怎么办?

IT人利伟 阅读 30

我在用Flutter的Platform Channel调用Android原生的地理位置权限请求,但发送MethodCall后native端的回调方法完全没反应。已经确认channel名称和方法名都匹配了。

尝试过在Android端打印日志,发现onMethodCall确实收到了Flutter的请求,但调用result.success()或result.error()后,Flutter端既没收到success也没收到error回调。这是什么问题?

Android代码片段:


private final MethodChannel channel = new MethodChannel(registrar.messenger(), "location_channel");

@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    if (call.method.equals("requestLocation")) {
        // 权限申请逻辑...
        result.success("Permission granted"); // 这里执行过但没回调到Flutter
    }
}

Flutter调用代码:

await platform.invokeMethod('requestLocation').then((value) { print('收到结果'); });

有没有可能是因为Android的主线程被阻塞了?或者需要特殊处理异步调用?

我来解答 赞 8 收藏
二维码
手机扫码查看
1 条解答
UX-兰兰
UX-兰兰 Lv1
直接用,这个问题我遇到过好几次。核心问题是Result对象不能跨线程持有,你如果在子线程做权限申请或者延迟回调,直接调result.success()是无效的。

你在onMethodCall里调了权限请求,通常是异步弹框或者走Activity Result,但你这里直接同步返回success,实际权限还没拿到。正确做法是把Result存成成员变量或者通过回调传递,在真正拿到结果后再回传。

最简单的改法:把Result存起来等回调

private Result pendingResult;

@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
if (call.method.equals("requestLocation")) {
// 保存result,等权限结果回来再调
pendingResult = result;
requestLocationPermission(); // 真正去申请
}
}

// 在onRequestPermissionsResult或其他回调里
if (pendingResult != null) {
if (granted) {
pendingResult.success("granted");
} else {
pendingResult.error("DENIED", "Permission denied", null);
}
pendingResult = null; // 记得清空
}


Flutter那边没问题,就是.then接结果就行。关键点就一个:Result只能在主线程调一次,而且必须等到真实结果到了再调,不能提前。不然就静默失败,不会报错也不会回调。
点赞 3
2026-02-09 04:02