flutter - 从 Flutter 中的 Isolate 监听方法调用 UI 方法抛出异常
问题描述
我尝试使用 ovprogresshud ( https://pub.dev/packages/ovprogresshud ) 来显示下载进度。我使用 flutter_downloader ( https://pub.dev/packages/flutter_downloader ) 进行下载。
我尝试通过隔离更新进度,但收到错误。(如果我在我的代码中直接调用 Progresshud.showWithStatus,在下载之前说,它可以工作)
我的代码:
ReceivePort _port = ReceivePort();
...
IsolateNameServer.registerPortWithName(
_port.sendPort, 'downloader_send_port');
_port.listen(
(dynamic data) {
String id = data[0];
DownloadTaskStatus status = data[1];
int progress = data[2];
if (status == DownloadTaskStatus.complete) {
} else if (status == DownloadTaskStatus.running) {
Progresshud.showWithStatus("%$progress Downloaded");
}
},
onDone: () {
checkIfDictionaryUnzipped(DBFilePath);
},
onError: (error) {},
);
我收到的错误:
Unhandled Exception: PlatformException(error, Attempt to invoke virtual method 'android.view.ViewParent android.view.ViewGroup.getParent()' on a null object reference, null)
E/flutter (29114): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:569:7)
E/flutter (29114): #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:321:33)
E/flutter (29114): <asynchronous suspension>
E/flutter (29114): #2 Progresshud.showWithStatus (package:ovprogresshud/progresshud.dart:18:27)
E/flutter (29114): <asynchronous suspension>
....
解决方案
在此处查看重要说明
重要提示:您的 UI 在主隔离中呈现,而下载事件来自后台隔离(换句话说,回调中的代码在后台隔离中运行),因此您必须处理两个隔离之间的通信。
检查示例,
ReceivePort _port = ReceivePort();
@override
void initState() {
super.initState();
IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port');
_port.listen((dynamic data) {
String id = data[0];
DownloadTaskStatus status = data[1];
int progress = data[2];
setState((){ });
});
FlutterDownloader.registerCallback(downloadCallback);
}
@override
void dispose() {
IsolateNameServer.removePortNameMapping('downloader_send_port');
super.dispose();
}
static void downloadCallback(String id, DownloadTaskStatus status, int progress) {
final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port');
send.send([id, status, progress]);
}
推荐阅读
- python - val_accuracy 不会改变。总是完全相同的值
- opencv - 在地板(平面)上自然旋转纸张(矩形)
- lua - 无法在 lua 命令行上运行 lua 文件
- opencv - 使用opencv或深度学习以纵横交错的方式计算堆叠中的麻袋数量
- python - 从 python 代码而不是 KV 在屏幕之间切换
- python - 从 DataFrame 的列中提取子字符串
- c# - 无法加载本地 nuget 包。无法验证强名称签名
- swift - 尝试在 ios 中使用 Firebase Twitter 身份验证获取 Twitter 的访问令牌
- asp.net - docker build 失败并显示以下消息
- c# - 在另一个类中使用 RawInputEventArg 的值