如何识别 List 为空,避免 Bad state: No element for ListMixin.reduce

How to identify the List is empty, to avoid the Bad state: No element for ListMixin.reduce

我正在尝试根据用户选择计算一组值。我正在使用 reduce 方法来计算它。

它正在检查列表中的各个值并抛出此错误,因为列表中没有数据。

我对如何解决这个问题感到震惊,下面我附上了代码。

  get products => _products;

  get productSubtotal => _products.entries
      .map((product) => product.key.price * product.value)
      .toList();


  get total => _products.entries
      .map((product) => product.key.price * product.value)
      .toList()
      .reduce((value, element) => value + element)
      .toStringAsFixed(2);
}

下面我附上了错误信息。

Bad state: No element

The relevant error-causing widget was: 
  Obx Obx:file:///Users/elamparithibalakrishnan/workspace/purple_star/lib/widgets/cart_total_value.dart:14:12
When the exception was thrown, this was the stack: 
#0      ListMixin.reduce (dart:collection/list.dart:222:22)
#1      CartController.total (package:purple_star/screens/cart/cart_controller.dart:40:8)
#2      CartTotalWidget.totalController (package:purple_star/widgets/cart_total_value.dart:34:19)
#3      CartTotalWidget.build.<anonymous closure> (package:purple_star/widgets/cart_total_value.dart:27:15)
#4      Obx.build (package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart:70:28)
#5      RxInterface.notifyChildren (package:get/get_rx/src/rx_types/rx_core/rx_interface.dart:26:27)
#6      _ObxState.build (package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart:54:19)
#7      StatefulElement.build (package:flutter/src/widgets/framework.dart:4782:27)

提前致谢。

我发现你把问题复杂化了。你应该问的是如何对数字列表求和。

答案是 sum 来自 IterableExtension

的扩展方法

请注意,此方法专用于 List<num>List<int>List<double>,它将 return 更正结果类型

import 'package:collection/collection.dart';

List<num> nums1 = [1, 2, 3.0];
var s1 = nums1.sum;  // s1 is inferred to num

List<double> nums2 = [1.0, 2.0, 3.0];
var s2 = nums2.sum;  // s2 is inferred to double

List<int> nums3 = [1, 2, 3];
var s3 = nums3.sum;  // s3 is inferred to int

作为一个额外的好处,您可以直接在 Iterable 上调用 sum,而无需将其转换为列表:

var nums = [1, 2, 3.0];
var sumOfSquares = nums.map((x) => x * x).sum;
print(sumOfSquares);

What is the cleanest way to get the sum of numbers in a collection/list in Dart?

回答你原来的问题:

您可能正在寻找 fold<T> 方法

T fold<T>(
   T initialValue,
   T combine(T previousValue, E element)
)

与 reduce 相反,fold 允许您指定初始元素 - 空列表不再是问题。