flutter - 我在颤振中使用了 isolate.spawnUri() 并导致了致命错误
问题描述
这是我的鳕鱼:
void callTask()async{
Uri uri = Uri.parse('package:flutter_bedrock/base_framework/utils/isolate/factory/proxy_isolate.dart');
final ReceivePort receivePort = ReceivePort();
Isolate isolate = await Isolate.spawnUri(uri,
[], receivePort.sendPort);
SendPort childPort;
receivePort.listen((message) {
print('msg from proxy $message');
if(message[0] == kSendPortKey){
childPort = message[1];
childPort.send([kTaskKey,'test']);
}
});
}
我在颤动时调用 callTask() ,并记录以下内容:
E/flutter (14779): [ERROR:flutter/runtime/dart_isolate.cc(864)] Unhandled exception:
E/flutter (14779): error: native function 'Window_setNeedsReportTimings' (2 arguments) cannot be found
E/flutter (14779): #0 Window.onReportTimings= (dart:ui/window.dart:964:29)
E/flutter (14779): #1 SchedulerBinding.addTimingsCallback (package:flutter/src/scheduler/binding.dart:234:14)
E/flutter (14779): #2 SchedulerBinding.initInstances (package:flutter/src/scheduler/binding.dart:210:7)
E/flutter (14779): #3 PaintingBinding.initInstances (package:flutter/src/painting/binding.dart:21:11)
E/flutter (14779): #4 SemanticsBinding.initInstances (package:flutter/src/semantics/binding.dart:22:11)
E/flutter (14779): #5 RendererBinding.initInstances (package:flutter/src/rendering/binding.dart:30:11)
E/flutter (14779): #6 WidgetsBinding.initInstances (package:flutter/src/widgets/binding.dart:255:11)
E/flutter (14779): #7 new BindingBase (package:flutter/src/foundation/binding.dart:57:5)
E/flutter (14779): #8 new _WidgetsFlutterBinding&BindingBase&GestureBinding (package:flutter/src/widgets/binding.dart)
E/flutter (14779): #9 new _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding (package:flutter/src/widgets/binding.dart)
E/flutter (14779): #10 new _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding (package:flutter/src/widgets/binding.dart)
E/flutter (14779): #11 new _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding (package:flutter/src/widgets/binding.dart)
E/flutter (14779): #12 new _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding (package:flutter/src/widgets/binding.dart)
E/flutter (14779): #13 new _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding (package:flutter/src/widgets/binding.dart)
E/flutter (14779): #14 new _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding (package:flutter/src/widgets/binding.dart)
E/flutter (14779): #15 new WidgetsFlutterBinding (package:flutter/src/widgets/binding.dart)
E/flutter (14779): #16 WidgetsFlutterBinding.ensureInitialized (package:flutter/src/widgets/binding.dart:1203:7)
E/flutter (14779): #17 main (package:flutter_bedrock/main.dart:24:25)
E/flutter (14779): #18 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
E/flutter (14779): #19 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
在主要隔离中:
void main(){
WidgetsFlutterBinding.ensureInitialized();
IsolatePoolProxy.getInstance().callTask();
}
import 'dart:isolate';
const int kSendPortKey = 6633;
const int kTaskKey = 8844;
///
const String kMethodName = 'kMethodName';
const String kNameArgs = 'kNameArgs';
class IsolatePoolProxy{
IsolatePoolProxy._();
static IsolatePoolProxy _instance;
factory IsolatePoolProxy() => getInstance();
static IsolatePoolProxy getInstance(){
if(_instance == null){
_instance = IsolatePoolProxy._();
}
return _instance;
}
void callTask()async{
Uri uri = Uri.parse('package:flutter_bedrock/base_framework/utils/isolate/factory/proxy_isolate.dart');
final ReceivePort receivePort = ReceivePort();
Isolate isolate = await Isolate.spawnUri(uri,
[], receivePort.sendPort);
SendPort childPort;
receivePort.listen((message) {
print('msg from proxy $message');
if(message[0] == kSendPortKey){
childPort = message[1];
childPort.send([kTaskKey,'test']);
}
});
}
}
在 proxy_isolate.dart 文件的子隔离中:
import 'dart:async';
import 'dart:isolate';
const int kSendPortKey = 6633;
const int kTaskKey = 8844;
///
const String kMethodName = 'kMethodName';
const String kNameArgs = 'kNameArgs';
final List<String> orders = [];
void main( args,SendPort mainPort)async{
///connect with main isolate
final ReceivePort receivePort = ReceivePort();
final SendPort sendPort = receivePort.sendPort;
receivePort.listen((message) {
print('msg from main $message');
if(message[0] == kTaskKey){
orders.add(message[1]);
}
});
mainPort.send([kSendPortKey,sendPort]);
}
E/flutter(14779):[错误:flutter/runtime/dart_isolate.cc(864)]未处理的异常:E/flutter(14779):错误:找不到本机函数'Window_setNeedsReportTimings'(2个参数)
解决方案
推荐阅读
- qemu - 通过 libvirt 或 qmp 访问多个 Qemu-kvm 实例的 Guest
- ruby-on-rails - 如何根据 Ruby on Rails 迁移中另一行的选择值更改_column_default?
- flask - Flask SQLAlchemy query.all() 仅返回所有 id
- rust - 将默认参数传递给 cargo run
- dynamic - 通过添加具有“动态名称”的新字段来更新 Firestore 文档的语法 (React-Redux)
- javascript - 如何让机器人只响应句子中存在的一个“事件”,而不是两个
- reactjs - 反应原生导航 - 在添加/更新/删除项目时更新屏幕中的列表
- php - 尝试插入 SQL Server 数据库时出现“PK”错误附近的语法错误
- spring-boot - 如何解决我在使用 Vue JS 应用程序时遇到的以下 CORS 错误
- bash - 在 ZSH 中,变量行为不同于 bash