Dart 封装的列表(仅供观察值)

Dart encapsulated list (just for observing values)

我有以下列表

List<ProductVariation> _productVariations = []; avoid null pointer exceptions
List<ProductVariation> get productVariations => _productVariations;

添加List<ProductVariation> get productVariations => _productVariations;的主要目的是为了避免_productVariations被修改,但是,我可以在列表中添加、删除或进行任何操作,如何防止productVariations 从另一个文件访问时要修改?

您可以像这样制作 getter return 列表的副本。

List<ProductVariation> get productVariations => [..._productVariations];

或者

List<ProductVariation> get productVariations => _productVariations.toList();

另一种解决方案是使用 dart:collection 中的 UnmodifiableListView,这样效率会高很多,因为您不是在制作列表的新副本,而是只是为您的列表提供受保护的视图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, 2, 3]
  a.data.add(5); // Unhandled exception: Unsupported operation: Cannot add to an unmodifiable list
}

这个解决方案的一个缺点是 UnmodifiableListView 是一个正常的 List 从分析器的角度来看,所以你不会从这样做得到任何静态错误。但是如果您尝试修改列表本身,您将在运行时遇到异常。为了让开发人员更清楚,我认为指定返回的类型是 UnmodifiableListView 是很好的,即使您可以只写 List

另一点是,如果对象不是不可变的,此解决方案(或 Jigar Patel 建议的解决方案)不会阻止您修改列表中的对象本身。因此,如果您还想防止这些更改,则需要对对象进行深度复制。