You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端使用CompletableFuture时Flutter插件方法调用无法完成如何解决

问题根因

Flutter 规定 MethodChannel.Result 的回调方法(success/error/notImplemented)必须在 Android 主线程(UI 线程)执行。你当前代码中 CompletableFuture.thenRunAsync 默认会在子线程(ForkJoinPool 工作线程)调用 result.success,虽然 Android 侧代码执行了该方法,但 Flutter 侧无法接收到回调,导致 Dart 端第一个 await Zcspos.echo("Echo 1") 一直处于等待状态,后续的两个调用根本不会执行。

修复方案

修改 ZcsposPlugin.java 代码,将 Result 相关回调的调用切换到 Android 主线程执行,参考修改代码如下:

// 先在插件类中初始化绑定主线程Looper的Handler
private final Handler mainHandler = new Handler(Looper.getMainLooper());

private CompletableFuture<Void> waitAsync(int milliseconds) {
    return CompletableFuture.runAsync(() -> {
        try {
            Thread.sleep(milliseconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}

@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) {
    switch (call.method) {
        case "echo": {
            final String value = call.argument("value");
            this.waitAsync(1000).thenRunAsync(() -> { // 等待1秒
                Log.d(this.TAG, "Echoing '" + value + "'");
                // 切换到主线程调用Result回调
                mainHandler.post(() -> result.success(value));
            });
            break;
        }
        default:
            mainHandler.post(result::notImplemented);
    }
}

修改后所有Result回调都在主线程执行,Flutter端就能正常接收返回值,三个异步调用会依次执行,输出符合预期。

内容的提问来源于stack exchange,提问作者Martin Braun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:27:03