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

Android调用含await的Flutter异步函数无法获取返回值求助

问题:MethodChannel调用含await的Flutter异步函数无返回值

在Android的Kotlin代码中通过MethodChannel调用Flutter的Dart函数时,当Dart函数内使用await语句执行异步操作,Android端的MethodChannel.Result回调始终无法触发;但移除await语句后,Android端能正常获取返回值。请问如何实现带await的异步调用功能?

Flutter 代码

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return const Center();
  }

  static const platform = MethodChannel('myChannel');

  @override
  void initState() {
    super.initState();

    platform.setMethodCallHandler(myFunction);
  }

  Future<String> myFunction(MethodCall call) async {
    switch (call.method) {
      case "yourMethod":
        await Future.delayed(const Duration(seconds: 5));
        return "delayed 5 seconds";
    }
    return "not implemented";
  }
}

Android Kotlin 代码

class MainActivity: FlutterActivity() {

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }

    class MyBook: BookApi {
        override fun search(keyword: String): List<Book?> {
            return listOf(Book("book_title1", "author1"))
        }

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val flutterEngine = FlutterEngine(this)

        flutterEngine
            .dartExecutor
            .executeDartEntrypoint(
                DartExecutor.DartEntrypoint.createDefault()
            )

        val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "myChannel")
        
        channel.invokeMethod("yourMethod", "yourArguments", object: MethodChannel.Result {
            override fun success(result: Any?) {
                Log.d(TAG, "result = $result")
            }

            override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
                Log.d(
                    TAG,
                    "errorCode = $errorCode, errorMessage = $errorMessage, errorDetails = $errorDetails"
                )
            }

            override fun notImplemented() {
                Log.d(TAG, "notImplemented")
            }
        })
    }

    companion object {
        private const val TAG = "MainActivity"
    }
}

问题原因与解决方案

问题核心是你在onCreate里新建了独立的FlutterEngine实例,但Flutter端的MethodChannel是注册在configureFlutterEngine对应的默认引擎实例上的,两个引擎完全独立,导致Android端的方法调用无法被Flutter端的handler接收,和await本身无关——MethodCallHandler完全支持返回Future处理异步逻辑,await是合法用法。

修正后的Kotlin代码

复用FlutterActivity提供的默认引擎,在configureFlutterEngine方法内初始化MethodChannel并调用方法:

class MainActivity: FlutterActivity() {

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        GeneratedPluginRegistrant.registerWith(flutterEngine);
        
        // 使用默认引擎实例初始化Channel并调用方法
        val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "myChannel")
        
        channel.invokeMethod("yourMethod", "yourArguments", object: MethodChannel.Result {
            override fun success(result: Any?) {
                Log.d(TAG, "result = $result")
            }

            override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
                Log.d(
                    TAG,
                    "errorCode = $errorCode, errorMessage = $errorMessage, errorDetails = $errorDetails"
                )
            }

            override fun notImplemented() {
                Log.d(TAG, "notImplemented")
            }
        })
    }

    class MyBook: BookApi {
        override fun search(keyword: String): List<Book?> {
            return listOf(Book("book_title1", "author1"))
        }
    }

    companion object {
        private const val TAG = "MainActivity"
    }
}

额外说明

  • 若确实需要使用独立的FlutterEngine,需确保Flutter端的MethodChannel注册在该引擎对应的Dart环境中(即该引擎加载的Dart入口里要完成Channel注册),而非默认引擎的页面内。
  • MethodChannel原生支持异步交互,只要引擎实例匹配,带await的异步逻辑完全能正常触发Android端的回调。

内容的提问来源于stack exchange,提问作者Namek Master

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:01:15