如何识别 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
允许您指定初始元素 - 空列表不再是问题。
我正在尝试根据用户选择计算一组值。我正在使用 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
允许您指定初始元素 - 空列表不再是问题。