尝试在 Future<List> 上使用数组方法“折叠”来获取项目的总价格

Posted

技术标签:

【中文标题】尝试在 Future<List> 上使用数组方法“折叠”来获取项目的总价格【英文标题】:Trying to use array method "fold" on a Future<List> to get total price of items 【发布时间】:2020-03-22 17:59:27 【问题描述】:

在 Dart/Flutter 中,我正在构建一个模型,在该模型中,我使用 Future 和异步等待来获取所有产品的远程端点。

当我检索到列表后,我想指定一个属性,该属性使用 Dart 列表的“折叠”方法返回所有项目的总数。

类似这样的:

Future<List<Product>> get items async => // here i get products
  await Future.wait(_itemIds.map((id) => api.getProduct(id))); 

Future<int> get totalPrice async => // here i calculate products total amount
  await items.then((iii) => iii.fold(0, (total, current) async  
        return total + current.price;
  )
);

但我得到一个错误:

没有为“FutureOr”类定义运算符“+”。尝试 定义运算符 '+'.dart(undefined_operator)。

我应该如何用异步语言解决这个问题?

谢谢

【问题讨论】:

Dart 编译器仍然返回相同的错误:没有为类“Product”定义运算符“+”。尝试定义运算符 '+'.dart(undefined_operator) 【参考方案1】:

您的代码的问题是 await 不适用于 items 但适用于所有表达式 items.then(...

以下代码应该可以工作:

Future<List<Product>> get items async => // here i get products
  await Future.wait(_itemIds.map((id) => api.getProduct(id))); 

Future<int> get totalPrice async  // here i calculate products total amount
  final products = await items;
  return products.fold<int>(0, (total, current) => total + current.price);
;

【讨论】:

你也可以return (await items).fold(0, (total, current) =&gt; total + current.price);。我通常这样做是为了避免创建另一个变量。 谢谢,但两者仍然返回相同的编译器错误:未为类“FutureOr”定义运算符“+”。尝试定义运算符“+”。 代码已更新。我认为这个问题来自这个异步函数中折叠类型参数的错误推断。 是的,铸造折叠法解决了这个问题。谢谢

以上是关于尝试在 Future<List> 上使用数组方法“折叠”来获取项目的总价格的主要内容,如果未能解决你的问题,请参考以下文章

错误:类型“Future<dynamic>”不是“List<dynamic>”类型的子类型。扑

如何将数据附加到 Future<List<Adds>>

没有为类型“Future<List<Item>>”定义吸气剂“长度”

Flutter 类型“Future<List<dynamic>>”不是类型转换中“List<dynamic>”类型的子类型

如何在 Flutter 中获取 Future<List> 项的某个数据索引?

如何在 Flutter 中对 DataTable 小部件上的 Future<List> 数据类型进行排序?