【问题标题】:Mapping large data into list in Dart/Flutter Asynchronously在 Dart/Flutter 中将大数据异步映射到列表中
【发布时间】:2021-11-18 21:31:17
【问题描述】:

我有一个以 JSON 类对象表示的大数据列表。这是从 SQLite 数据库获取的Iterable<Map<String, dynamic>>

运行查询甚至过滤结果数据都是异步运行的,但是当我尝试将此数据映射到一个类时,主线程会冻结。

整个代码块在一个异步函数中,它返回一个未来的数据,但由于某种原因,toList 只同步运行。

我尝试使用compute,但它一直在说

Invalid argument(s): Illegal argument in isolate message : (object is a closure - Function '<anonymous closure>':.)

我什至尝试过 RxDart 的 asyncMap,但这似乎并没有什么不同。

试图避开function 并使用普通的for 也不起作用。

如何使映射代码异步运行?

这是有问题的确切代码

    final filteredCards = cardsRaw.where((e) {
      return csvData.any(
        (element) =>
            e['card_name'] == element.cardName &&
            (e['number'] as String).startsWith(element.cardNumber) &&
            e['set_name'] == element.setName,
      );
    }).toList();

cardsRaw 是 11k,csvData 是 1000

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    Dart 是单线程的,这意味着即使是异步调用也会冻结主线程,如果它有一个昂贵的计算。

    这样做的正确方法是使用 compute 生成隔离,就像您尝试过的那样,但 compute 只能采用 top-level(在类之外声明的函数)或 静态函数,这就是你的错误的原因。

    Flutter 有一个方便的 cookbook 解释了如何在后台解析 JSON:

    您可以通过使用 Flutter 提供的 compute() 函数将解析和转换移动到后台隔离来消除卡顿。 compute() 函数在后台隔离中运行昂贵的函数并返回结果。

    【讨论】:

    • 我试过了,但计算只知道几种类型的数据。 Iterable 不是其中之一,所以这并不能解决我的问题
    • 你这是什么意思?
    • This example 使用 computeIterable 并返回 Map,这应该是你想要的。
    • 我最终将大部分阻塞代码移植到计算中,但并不容易或不方便
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 2020-05-21
    • 1970-01-01
    • 2021-10-10
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多