问题标签 [dart-isolates]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3625 浏览

flutter - Flutter - 如何在不阻塞 UI 的情况下计算包含未来的繁重任务?

我正在创建一个以 json 格式从 Internet 获取帖子的应用程序。我使用工厂将 json 解析为 Flutter 中的 Post 对象。Post 对象包括标题、正文和图像。我使用列表视图构建器在列表视图中显示这些帖子。繁重的任务是我从图像中计算出 2 种主色以设置为帖子项目的背景渐变。为此,我使用:https ://pub.dartlang.org/packages/palette_generator

我计算了 json 解析器工厂中的 2 种主色,因为这样我就有了一个完整的 Post 对象,其中包含所有需要的信息。同样这样我就不必在渲染 Post 对象时计算颜色。我使用以下代码执行此操作:

我将它添加到 Post 对象并在渲染中等待这个未来:

在主 UI 中,我会显示一个加载指示器,直到解决所有期货。为此,我使用以下代码:

除了获取新帖子时 UI 滞后外,这可以正常工作。经过一番阅读,我发现我可以在 Flutter 中使用 Isolates。所以我改变了我的解析功能,如下所述:https ://flutter.io/docs/cookbook/networking/background-parsing

这完美无瑕,我的应用程序运行没有任何延迟,缺点是我的颜色没有计算。出于某种原因,当我使用 compute() 时,我的 Future 永远不会得到结果。

在这种情况下是否可以使用计算,或者是否有更好的方法来计算颜色而不会导致我的 UI 滞后?

编辑

我尝试在没有计算的情况下对 Isolate 进行编程,但颜色期货仍然无法加载。这是我使用的代码:

我确实收到了所有数据,但我的未来再次没有完成。

0 投票
1 回答
2167 浏览

dart - Dart / Flutter:Isolate 顶级函数的异步行为

是的,好人,我正在经历一种奇怪的行为

异步使用isolate的顶层函数时;

你可以在这里找到示例代码,但总之

作为隔离的顶级功能,这有效:

这不会:

谁能解释我为什么?

(或者如果应该工作,为什么不在我的代码中这样做?)

先感谢您

弗朗切斯科

...

[编辑:刚刚注意到有人提出了类似的问题,

尽管如此,它仍然没有得到答复 从 Isolate 函数调用异步函数

加上问题在github上打开]

0 投票
1 回答
1055 浏览

flutter - Android 警报管理器回调不起作用

我试图使用插件Android 警报管理器在后台执行计时器和代码,但不能真正让它正常工作。如果我将“print(”v“)”之类的东西设置为回调 - 一切正常,但是当我尝试做一些额外的事情时,它就不起作用了。

我希望该代码在 1 分钟后发送消息,而不是在执行后立即收到消息并得到 Error "/flutter (11424): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: 'dart: ui/plugins.dart':断言失败:第 62 行:'':'callback' 不能为空。”

0 投票
1 回答
1605 浏览

dart - 在 Flutter 应用程序中将辅助隔离中的地理定位作为后台任务

我想在后台获取设备的地理位置,即使应用程序终止。Flutter 提供了 Isolates 和 AlarmManager,作为这样做的一种方式。

同样,我的最终目标是即使应用程序已终止,也能获得设备的 GeoLocation。

我已经浏览了https://medium.com/flutter-io/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124 但并不完全理解,因为我是新手扑。如果这是唯一的方法,请帮助我理解它。

我正在使用插件:- https://pub.dartlang.org/packages/geolocator https://pub.dartlang.org/packages/flutter_isolate

正如我所看到的,当 Geolocator 在内部检查 GoogleApiAvailability 插件后尝试获取位置时,问题就出现了,使用辅助隔离内的“Channel.invokeMethod”。它抛出的错误是:-

看看:- https://github.com/BaseflowIT/flutter-geolocator/blob/b869f3221c890c2ae87b22d0384577fd902d38ca/lib/geolocator.dart#L75

在以下位置调用 GoogleApiAvailability:- https://github.com/BaseflowIT/flutter-google-api-availability/blob/96ffe46a7cf8d81bfa107ca83ce2aaf8a5ff4847/lib/src/google_api_availability.dart#L23

这是在二级隔离上崩溃的线路。

地理定位插件有一个额外的配置,我可以强制 LocationManager 跳进去。这不会崩溃,但只要应用程序终止就会挂断。以下是地理定位器插件中的强制方式:- https://github.com/BaseflowIT/flutter-geolocator/blob/b869f3221c890c2ae87b22d0384577fd902d38ca/lib/geolocator.dart#L64

可以在调用 getLocation 方法之前设置此标志。

如果这不起作用,我需要帮助来了解如何实现我的目标。

理想情况下,它应该给我二次隔离的位置。我需要了解相同所需的正确配置。

0 投票
1 回答
53 浏览

dart - Dart 隔离 SendPort 和 ReceivePort 发送 100 次,反之亦然

我的main作品,但在我的作品中,foo我想将数据发送到 main. 这是我的代码,我想在其中传递100 次之间foo的数据。main我怎样才能做到这一点?

0 投票
0 回答
709 浏览

dart - 即使应用程序关闭,如何在后台运行任务并获取任务生成的最新结果并在应用程序打开时显示它?

我想在 Flutter 中创建一个计步器应用程序,所以我使用了 Flutter 计步器插件,它运行良好,但我想每次都运行这个插件来计算用户步数,即使主应用程序已关闭。

我发现我可以使用 dart 隔离来创建一个任务,该任务可以在远离主线程的另一个线程中运行,并通过端口在它们之间进行通信。

我希望输出是用户步骤数。

但我得到那个错误

0 投票
1 回答
865 浏览

flutter - 如何从主隔离和后台隔离刷新和共享访问令牌

我的颤振应用程序正在使用刷新和访问令牌来验证对 ac# Web API 的请求。这完美地工作。但是,一旦我引入 android_alarm_manager 来进行数据的一些后台同步(使用隔离),我发现我的刷新令牌在一段时间后变得无效(我将刷新令牌存储在本地存储中)。

这是由于多个隔离同时请求新的访问令牌(由于隔离不共享内存,我无法锁定该方法)。现在我不确定保持令牌同步的最佳方法是什么。

我在想每个隔离都可以有自己的刷新和访问令牌,但这似乎不是一个好主意,因为我必须在本地存储用户名和密码。我的另一个想法是使用隔离通​​信或本地存储在隔离之间设置一些同步策略,但感觉有点矫枉过正。

谢谢

0 投票
1 回答
1927 浏览

flutter - Flutter Dart - 在 Isolate 中调用 sqflite 函数会导致错误

我有一个有效的 sqflite 数据库,单元测试有效。我想在 onTap 方法中调用 sqflite 方法。我知道我无法在主 UI 线程中执行 sqflite 函数(Flutter 在运行时告诉我)。所以我创建了一个 Isolate 来调用 sqflite 函数,它给出了不同的错误。如果我不调用 sqflite 函数,Isolate 就可以工作,如果我只返回一个 bool 就可以工作。这是代码和异常-感谢您的任何建议:


来自 UI 的片段

从 UI 调用的方法

隔离回调


我/颤振(2073):电子邮件:电子邮件,密码:Passw0rd

E/flutter(2073):[错误:flutter/runtime/dart_isolate.cc(805)]未处理的异常:

E/flutter(2073):错误:找不到本机函数“Window_sendPlatformMessage”(4 个参数)

E/flutter (2073):#0 Window.sendPlatformMessage (dart:ui/window.dart:1089:9)

E/flutter(2073):#1 _DefaultBinaryMessenger._sendPlatformMessage(包:flutter/src/services/binary_messenger.dart:85:15)

E/flutter(2073):#2 _DefaultBinaryMessenger.send(包:flutter/src/services/binary_messenger.dart:129:12)

E/flutter(2073):#3 MethodChannel.invokeMethod(包:flutter/src/services/platform_channel.dart:309:51)

电子/颤振(2073):

E/flutter(2073):#4 调用方法(包:sqflite/src/sqflite_impl.dart:18:34)

电子/颤振(2073):

E/flutter(2073):#5 SqfliteDatabaseFactoryImpl.invokeMethod(包:sqflite/src/factory_impl.dart:33:7)

E/颤振(2073):#6 _SqfliteDatabaseFactoryImpl&Object&SqfliteDatabaseFactoryMixin.safeInvokeMethod。(包:sqflite/src/factory_mixin.dart:22:35)

E/flutter(2073):#7 wrapDatabaseException(包:sqflite/src/exception_impl.dart:7:34)E/flutter(2073):。

E/flutter(2073):#8 SqfliteDatabaseFactoryImpl.wrapDatabaseException(包:sqflite/src/factory_impl.dart:29:7)。

E/flutter(2073):#9 _SqfliteDatabaseFactoryImpl&Object&SqfliteDatabaseFactoryMixin.safeInvokeMethod(包:sqflite/src/factory_mixin.dart:22:7)。E/颤振(2073):#10 _SqfliteDatabaseFactoryImpl&Object&SqfliteDatabaseFactoryMixin.getDatabasesPath(包:sqflite/src/factory_mixin.dart:136:17)。E/flutter(2073):E/flutter(2073):#11 getDatabasesPath。(包:sqflite/sqflite.dart:166:54)E/flutter(2073):#12 UsersSqflite.init(包:himrepo/controller/users_database.dart:20:47)。电子/颤振(2073):。E/颤振(2073):#13 _LoginPageState.searchForUser。(包:himrepo/ui/login.dart:268:24)。电子/颤振(2073):。E/flutter (2073):#14 _LoginPageState.callbackFunction(package:himrepo/ui/login.dart:166:28)。电子/颤振(2073):。电子/颤振(2073):#15 _startIsolate.. (dart:isolate-patch/isolate_patch.dart:304:17)。E/flutter (2073):#16 _RawReceivePortImpl._handleMessage(dart:isolate-patch/isolate_patch.dart:172:12)。

直接执行 Sqflite 方法给出

0 投票
1 回答
1175 浏览

flutter - Flutter 在哪个线程/隔离上运行 IO 操作?

例如,在使用 http 包或进行一般 IO 操作时颤动

我已通读引擎架构,表明引擎中有 4 个线程

  • 平台任务运行器
  • UI 任务运行器
  • GPU 任务运行器
  • IO 任务运行器

主应用程序 dart 代码在 UI 任务运行线程上运行。IO 任务运行器似乎仅用于 dart 引擎读取图像处理耗时的图像 IO,而不是应用程序 IO 发生的位置?

我知道 IO 库具有基于 Future 的无阻塞接口,因此我提供给 IO 库的回调将在 UI 线程上运行,但是实际的 IO 操作本身呢? Dart VM 正在使用 OS 线程来执行这些操作操作?

例如,如果我尝试上传/下载 800MB 的视频文件,是否有 Dart VM 使用的后台 IO 线程来执行实际的 IO?

是否应该将单独的隔离用于大型 IO 操作,例如上传/下载大文件?

0 投票
1 回答
35 浏览

dart - 如何在隔离内创建三个无限循环?

我正在学习 Dart 并使用 Isolate。我编写了下一个代码,并期望它将创建三个可以无限工作的隔离进程:

但是我得到了非常奇怪的输出,例如(每次都不同):