flutter - 我在 flutter 中使用了 isolate.spawnUri() 并导致了 fatal error

标签 flutter dart dart-isolates

这是我的鳕鱼:

  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']);
      }
    });



  }
我在 flutter 时调用 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):错误:找不到 native 函数“Window_setNeedsReportTimings”(2 个参数)

最佳答案

您不能使用 dart:ui在隔离物中。
this issue在 flutter 的 github 上。
似乎没有解决方法。你不能那样做,找到另一种方法来做你想做的事。

关于flutter - 我在 flutter 中使用了 isolate.spawnUri() 并导致了 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63682897/

相关文章:

Flutter - 如何在 Flutter 中从 Phpmyadmin 获取和显示数据

flutter - 在charts_flutter中设置轴的最小和最大范围

google-app-engine - Dart2Js 生成的代码无法访问 Google 云端点

flutter - Pod 安装错误 : The name of the given podspec 'file_picker' doesn't match the expected one 'gx_file_picker'

firebase - 如何使用Flutter更新Cloud Firestore上文档的字段?

android - 如何在创建的 RaisedButton 对象中设置函数?

dart - Dart 中的关闭 Hook ?

flutter - flutter 在什么线程/隔离上运行 IO 操作?

Dart,如何将用户字符串解析为功能性的 dart 代码?

flutter - 带有 Scaffold 的 InheritedWidget 似乎无法正常工作