问题描述
我有以下列表
List<ProductVariation> _productVariations = []; avoid null pointer exceptions
List<ProductVariation> get productVariations => _productVariations;
添加List<ProductVariation> get productVariations => _productVariations;
的主要目的是避免对_productVariations
进行修改,但是,我能够在列表内添加,删除或执行任何操作,如何防止{{1 }}从另一个文件访问时要修改?
解决方法
您可以使getter返回这样的列表的副本。
List<ProductVariation> get productVariations => [..._productVariations];
或
List<ProductVariation> get productVariations => _productVariations.toList();
,
另一种解决方案是使用UnmodifiableListView
中的dart:collection
,因为您无需制作列表的新副本,而只是提供{{ 1}}:
List
该解决方案的一个缺点是,从分析仪的角度来看,import 'dart:collection';
class A {
final List<int> _data = [1,2,3];
UnmodifiableListView<int> get data => UnmodifiableListView(_data);
}
void main() {
final a = A();
print(a.data); // [1,3]
a.data.add(5); // Unhandled exception: Unsupported operation: Cannot add to an unmodifiable list
}
是普通的UnmodifiableListView
,因此这样做不会带来任何静态错误。但是,如果您尝试修改列表本身,则会在运行时遇到异常。为了使开发人员更清楚,我认为最好将返回的类型指定为List
,即使您可以只写UnmodifiableListView
。
另一点是,如果对象不是不可变的,则此解决方案(或Jigar Patel建议的解决方案)不会阻止您修改列表中的对象本身。因此,如果您还想防止这些更改,则需要制作对象的深层副本。