flutter 如何在没有UI滞后的情况下进行循环计算?

flseospp  于 12个月前  发布在  Flutter
关注(0)|答案(1)|浏览(135)

我现在内存中有1000多个模型,如果我在UI和UI中改变一些东西,它完全取决于这些模型。现在我不能在主UI隔离中使用for循环,因为它会使UI滞后,但我仍然需要改变模型的值,我怎么能做到这一点?
我认为我可以使用不同的分离株并在新的分离株中进行计算,但我仍然需要使用端口在主分离株中正确获取这些更改的值。从不同的分离株中获取值也会减慢速度?

3j86kqsm

3j86kqsm1#

对于繁重的计算和异步更新UI使用单独的隔离是防止主UI线程变得滞后的好策略。然而,隔离之间的通信涉及消息传递,并且它可能会引入一些开销。
在这里,我演示了隔离与不通信,计算值退出隔离,并将它们传递回主线程,这样你就可以更新UI后,隔离得到完成。

void _parallelOp() async {
    try {
      // Receive port.
      ReceivePort receivePort = ReceivePort();

      // Creating a new tread or isolate in flutter terms.
      await Isolate.spawn(ParallelOperation.parallelOp, {
        AppConsts.sendPort: receivePort.sendPort,
        // pass models that used in the calculation
        // or requires modifications
        // as key value pair.
      });

      // updated values/models.
      final Map<String, dynamic> foo = await receivePort.first;
    } catch (e) {
      await Future.error(StringConsts.errorInParallelOperation);
    }
  }

字符串
隔离的方法将定义如下,记住隔离方法需要是一个具有隔离生成方法的不同类。

class ParallelOperation {
  /// [parallelOp] do the parallel computing.
  static Future<void> parallelOp(Map<String, dynamic> args) async {
   
    // retrieve your models.
    final dynamic model = args['key'];
    
    // Do the computation or modification.

    /// Exiting the isolate,
    /// as all the operations are completed.
    /// pass direct model or map having multiple values and model.
    Isolate.exit(args[AppConsts.sendPort], model);
  }
}


为了在运行的隔离中发送数据,您需要侦听receivePort并使用sendPort从隔离中发送数据。

相关问题