因为我的flutter应用程序运行不流畅,我认为问题可能是flutter中的单线程。所以我开始采取第一步运行隔离来避免一个事件循环。然而,我遇到了以下问题,这可能是错误地使用了隔离:
我从类的外部调用addNewChild
方法。我将所有变量转换为map
,以运行compute
方法并调用addNewChildStatic
方法,即static
,如下所示:
void addNewChild(
childFacilityId,
childFacility,
childGroup,
groupId,
childFirstName,
childLastName,
userImageFile,
isHorizontalImage,
) {
Map map = Map();
map['childFacilityId'] = childFacilityId;
map['childFacility'] = childFacility;
map['childGroup'] = childGroup;
map['groupId'] = groupId;
map['childFirstName'] = childFirstName;
map['childLastName'] = childLastName;
map['userImageFile'] = userImageFile;
map['isHorizontalImage'] = isHorizontalImage;
compute(addNewChildStatic, map); //here I run isolate using compute method
}
addNewChildStatic看起来像这样:
static Future<void> addNewChildStatic(Map map) async {
print('COMPUTE addNewChildStatic STARTED');
WidgetsFlutterBinding.ensureInitialized(); // I have added this because the errors I was getting in the console
Firebase.initializeApp(); // I have added this because the errors I was getting in the console that there was no Firebase
final childFacilityId = map['childFacilityId'];
final childFacility = map['childFacility'];
final childGroup = map['childGroup'];
final childGroupId = map['groupId'];
final childFirstName = map['childFirstName'];
final childLastName = map['childLastName'];
final childImageFile = map['userImageFile'];
final isHorizontalImage = map['isHorizontalImage'];
try{
//methods
} catch(e){
//error handling
}
}
问题是我得到以下错误:
flutter: COMPUTE addNewChildStatic STARTED
[VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: UI actions are only available on root isolate.
#0 PlatformDispatcher._nativeSetNeedsReportTimings (dart:ui/platform_dispatcher.dart:501:59)
#1 PlatformDispatcher.onReportTimings= (dart:ui/platform_dispatcher.dart:493:29)
#2 SchedulerBinding.addTimingsCallback (package:flutter/src/scheduler/binding.dart:279:26)
#3 SchedulerBinding.initInstances (package:flutter/src/scheduler/binding.dart:211:7)
#4 ServicesBinding.initInstances (package:flutter/src/services/binding.dart:36:11)
#5 PaintingBinding.initInstances (package:flutter/src/painting/binding.dart:20:11)
#6 SemanticsBinding.initInstances (package:flutter/src/semantics/binding.dart:18:11)
#7 RendererBinding.initInstances (package:flutter/src/rendering/binding.dart:28:11)
#8 WidgetsBinding.initInstances (package:flutter/src/widgets/binding.dart:245:11)
#9 new BindingBase (package:flutter/src/foundation/binding.dart:147:5)
#10 new _Widgets<…>
我认为UI只在主线程中更新,所以我应该在分离株之间进行一些通信。不幸的是,我不知道如何处理它。我将感谢任何帮助的家伙。
在此先表示衷心的感谢!
1条答案
按热度按时间thigvfpy1#
正如您正确提到的,您只能在主线程上运行UI更新,而不能在通过
compute()
创建的任何其他分离菌株上运行UI更新。所以你要做的第一件事就是
然后,为了与隔离进行简单的通信,您还可以返回值并在
FutureBuilder
中使用它们。以通过