首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在颤振中运行隔离;未处理的异常:用户界面操作仅适用于根隔离。

在颤振中运行隔离;未处理的异常:用户界面操作仅适用于根隔离。
EN

Stack Overflow用户
提问于 2022-11-16 22:32:14
回答 1查看 40关注 0票数 1

因为我的颤振应用程序运行不流畅,我想问题可能是单线程在颤振。因此,我在运行隔离的第一步,以避免只有一个事件循环。然而,我面临以下问题,这可能是使用隔离的错误:

我正在从类外调用方法addNewChild。我将所有变量转换为map以运行compute方法,并调用addNewChildStatic方法(即static ),如下所示:

代码语言:javascript
复制
    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看起来是这样的:

代码语言:javascript
复制
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
}
    }

问题是,我得到了以下错误:

代码语言:javascript
复制
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只在主线程中更新,所以我应该在隔离器之间进行一些通信。不幸的是,我不知道该如何处理它。我会感谢任何帮助的人。

非常感谢,提前!

EN

回答 1

Stack Overflow用户

发布于 2022-11-17 00:49:03

正如您正确地提到的,您只能在主线程上运行UI更新,而不能在通过compute()创建的任何其他隔离点上运行UI更新。

所以你要做的第一件事就是

代码语言:javascript
复制
WidgetsFlutterBinding.ensureInitialized();

然后,对于与隔离器的简单通信,还可以返回值并在FutureBuilder中使用它们(例如)。

代码语言:javascript
复制
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"
}

通过

代码语言:javascript
复制
FutureBuilder(
    future: compute(_runningFunction, 10),
    builder: (context, snapshot) {
        if (snapshot.hasData) {
            return Text(snapshot.data);
        } else {
            return CircularProgressIndicator();
        }
  },
),
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74468047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档