final Iterable<int> foo = [1, 2, 3];
foo.add(4); // ERROR: The method 'add' isn't defined.
// WARNING: following code can be used to mutate the container.
(foo as List<int>).add(4);
print(foo); // [1, 2, 3, 4]
final Iterable<int> foo = List.unmodifiable([1, 2, 3]);
foo.add(4); // ERROR: The method 'add' isn't defined.
(foo as List<int>).add(4); // Uncaught Error: Unsupported operation: add
// The following code may appear to be circumventing
// the implemented restriction, but it is
// OK because it does not mutate foo; rather,
// foo.toList() returns a separate instance.
foo.toList().add(4);
print(foo); // [1, 2, 3]
5条答案
按热度按时间zpqajqem1#
您可以使用
Iterable<type>
。它不是List<type>
,不提供修改方法,但提供迭代方法。如果需要,它还提供.toList()
方法。根据您的构造,使用Iterable
而不是List
可能更好,以确保一致性。几乎不错
即使
foo
被示例化为可变的List
,接口也只是说它是Iterable
。好
使用
List<E>.unmodifiable
构造函数:n3schb8v2#
编译时间常数列表变量
使用
const
关键字创建列表。const
时,在列表文字之前添加可选的const
关键字是多余的。编译时间常数列表值
如果变量不能是
const
,您仍然可以将值设置为const
。运行时常量列表
如果直到运行时才知道列表元素是什么,那么可以使用
List.unmodifiable()
构造函数来创建一个不可变列表。xwbd5t1u3#
在Dart中没有不可修改列表的 type,只有
List
类型。一些List
实现接受调用add
,另一些不接受。你可以返回一个 * 实际上 * 不可修改的列表,比如说用
List.unmodifiable
创建的,作为List
,如果用户试图在它上面调用add
,将会得到一个运行时错误。hxzsmxv24#
为了防止列表被修改,只需使用内置dart:collection库中的
UnmodifiableListView
:1wnzp6jl5#
您应该使用
IList
package:darts/dartz.dart
中的一个不可变列表,次佳的解决方案是使用KtList
(这是一个不可变的Kotlin集合),两者都是不可变的,并且将用作不可变列表,然而,我更喜欢KtList
,因为它更容易使用。另外,请查看这篇关于不变性的文章 (https://medium.com/dartlang/an-intro-to-immutability-with-dart-d4de871865c7)
这个在ktlist https://medium.com/flutter-community/kt-dart-better-collections-for-your-flutter-business-logic-41886ab7883 上