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



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

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

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)

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

有没有一种以异步方式获取C++数据的解决方案?

我知道Flutter支持事件通道将数据从C++发送回Flutter。但是,仅仅请求Flutter端的数据并等待它在未来到达,这样我就可以在FutureBuilder中拥有许多小部件,这些小部件在准备好时可以解析为一些东西,这又如何呢?

如果从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)
}
}

调用异步任务:

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

希望这能在中起作用

import 'dart:async';
Future<Uint8List> fetchData(buffer) async {

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

return result;
}

把它叫做

fetchData(buffer).then((result) => {
print(result)
}).catchError(print);

证明其有效:

import 'dart:async';
Future<String> fetchUserOrder() async {

await Future.delayed(Duration(seconds: 5));

return 'Callback!';
}
Future<void> main() async {

fetchUserOrder().then((result) => {
print(result)
}).catchError(print);


while(true){
print('main_thread_running');
await Future.delayed(Duration(seconds: 1));
}

}

输出:

main_thread_running
main_thread_running
main_thread_running
main_thread_running
main_thread_running
Callback!
main_thread_running
main_thread_running
...

最新更新