Dart封装列表仅用于观察值

问题描述

我有以下列表

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建议的解决方案)不会阻止您修改列表中的对象本身。因此,如果您还想防止这些更改,则需要制作对象的深层副本。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...