首页 > 解决方案 > 我在颤振中使用了 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个参数)

标签: flutterdartdart-isolates

解决方案


您不能dart:ui在隔离物中使用。

在颤振 github 上查看这个问题。

似乎没有解决方法。你不能那样做,找到另一种方法来做你想做的事。


推荐阅读