我正在调用一个本地SDK,它会运行并执行一些API调用,这显然是一项有时间限制的工作。对于90%的工作,我使用回调和方法通道调用双向,这样Dart可以调用Swift,然后Swift可以在完成时调用Dart。
我遇到的问题是,当我想要同步时,等待API响应(或超时)。
我运行了一些测试,因为我本来打算推迟发送FlutterResult
,直到Swift回调被击中为止,但是这个会严重降低UI的速度,因为我相信所有的平台调用都是在UI线程上进行的。我模拟了10秒的响应时间,应用程序将完全挂起几秒钟,然后再次响应,如果我发送了其中的几个请求,应用程序将挂起超过10秒。
运行同步平台代码的最佳方式是什么,我有点困惑,因为我不认为平台代码可以从孤立的地方调用。
我也想
F 214
等待时的动画是当然的一部分,詹克斯。我也不完全确定为什么,因为运行通用CPU工作,它的原生或dart不应该冻结渲染引擎吗?
总之,我唯一能想到的就是:
true
AwaitingMethodA
设置为返回FlutterResult,但在Swift命中在回调中设置回调,跳转UI线程并将消息发送回Dart表示完成,这将AwaitingMethodA设置为false
如果需要的话,我可以为上面设置一个超时计时器来断开循环。
这种方法是否有什么问题,或者是否有一个更好的同步、有时间限制的平台工作约定?
发布于 2021-03-30 10:27:18
不要在循环中等待-这就是问题所在。
您应该使用Completer类(https://api.flutter.dev/flutter/dart-async/Completer-class.html)。如文档所述-使用Completer,您可以轻松地将基于回调的api转换为未来的基于api的api。
您的代码可能如下所示:
class SdkResultType {
//let's assume this is the type that Sdk will return
}
class MyClass {
Completer _completer;
Future<SdkResultType> callSdk() {
_completer=Completer();
///this is where you would call the SDK
somehowCallTheSDK();
// this is where your code will wait
return _completer.future;
}
// your SDK callback - SDK should call this when completed
void sdkCallback(SdkResultType sdkResult) {
if (!_completer.isCompleted) {
//this is where you complete the _completer.future, unblocking your mainSdkCall function.
_completer.complete(sdkResult);
}
}
void mainSdkCall() async {
//this is whare you wait
var sdkResult=await callSdk();
// do the rest here
}
}
https://stackoverflow.com/questions/66868414
复制相似问题