目前,这是我使用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
...