因为我的颤振应用程序运行不流畅,我想问题可能是单线程在颤振。因此,我在运行隔离的第一步,以避免只有一个事件循环。然而,我面临以下问题,这可能是使用隔离的错误:
我正在从类外调用方法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只在主线程中更新,所以我应该在隔离器之间进行一些通信。不幸的是,我不知道该如何处理它。我会感谢任何帮助的人。
非常感谢,提前!
发布于 2022-11-17 00:49:03
正如您正确地提到的,您只能在主线程上运行UI更新,而不能在通过compute()创建的任何其他隔离点上运行UI更新。
所以你要做的第一件事就是
WidgetsFlutterBinding.ensureInitialized();然后,对于与隔离器的简单通信,还可以返回值并在FutureBuilder中使用它们(例如)。
static Future<string> addNewChildStatic(Map map) async {
// Perform some heavy async computation tasks
// Return a result object in the end (in this case, a string).
return "Finished calculation"
}通过
FutureBuilder(
future: compute(_runningFunction, 10),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data);
} else {
return CircularProgressIndicator();
}
},
),https://stackoverflow.com/questions/74468047
复制相似问题