Flutter 的 invokeMethod 上有没有异步等待 C++ 数据的解决方案?

Gue*_*OCs 6 c++ dart flutter

目前,这是我使用 Flutter 从 C++ 中读取的方式:

final Uint8List result = await platform.invokeMethod(Common.MESSAGE_METHOD, {"message": buffer});
Run Code Online (Sandbox Code Playgroud)

Kotlin 是这样处理的:

    MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
        if (call.method == MESSAGE_METHOD) {
            val message: ByteArray? = call.argument<ByteArray>("message")
            //... //response = Read something FROM C++
            result.success(response)
Run Code Online (Sandbox Code Playgroud)

由于这发生在主线程中,如果我花太多时间来回答,我会使 Flutter 的 UI 变慢。

是否有以异步方式获取 C++ 数据的解决方案?

我知道 Flutter 支持事件通道将数据从 C++ 发送回 Flutter。但是仅仅在 Flutter 端请求数据并等待它到达 Future 怎么样,这样我就可以有很多小部件在FutureBuilder准备好时解析某些东西?

Rav*_*vta 3

如果从 C++ 读取某些内容是一个繁重的过程,您可以使用 AsysncTask 在 Android 后台执行它。

internal class HeavyMsgReader(var result: MethodChannel.Result) : AsyncTask<ByteArray?, Void?, String?>() {

    override fun doInBackground(vararg message: ByteArray?): String {
        //... //response = Read something FROM C++
        return "response"
    }

    override fun onPostExecute(response: String?) {
        result.success(response)
    }
}
Run Code Online (Sandbox Code Playgroud)

调用异步任务:

MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
        if (call.method == MESSAGE_METHOD) {
            val message: ByteArray? = call.argument<ByteArray>("message")
            HeavyMsgReader(result).execute(message);
Run Code Online (Sandbox Code Playgroud)