如何在Dart中返回一个不变的List?

7z5jn7bk  于 2023-01-03  发布在  其他
关注(0)|答案(5)|浏览(122)

所以在其他语言中有ArrayListMutableList允许修改(添加、删除、移除)列表项。现在为了避免修改这些列表,只需将MutableListArrayList返回为List
我想在Dart中做同样的事情,但是在Dart中返回一个List仍然允许你做list.add,在Dart中如何正确地做到这一点呢?

zpqajqem

zpqajqem1#

您可以使用Iterable<type>。它不是List<type>,不提供修改方法,但提供迭代方法。如果需要,它还提供.toList()方法。根据您的构造,使用Iterable而不是List可能更好,以确保一致性。

几乎不错

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]

即使foo被示例化为可变的List,接口也只是说它是Iterable

使用List<E>.unmodifiable构造函数:

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]
n3schb8v

n3schb8v2#

  • 正如Irn所说,在Dart中没有不可变列表的类型,但是这个补充答案给出了创建不可变列表的例子,你不能添加、删除或修改列表元素。*

编译时间常数列表变量

使用const关键字创建列表。

const myList = [1, 2, 3];
  • 注意 *:当变量已经是const时,在列表文字之前添加可选的const关键字是多余的。
const myList = const [1, 2, 3];

编译时间常数列表值

如果变量不能是const,您仍然可以将值设置为const

final myList = const [1, 2, 3];

运行时常量列表

如果直到运行时才知道列表元素是什么,那么可以使用List.unmodifiable()构造函数来创建一个不可变列表。

final myList = List.unmodifiable([someElement, anotherElement]);
xwbd5t1u

xwbd5t1u3#

在Dart中没有不可修改列表的 type,只有List类型。一些List实现接受调用add,另一些不接受。
你可以返回一个 * 实际上 * 不可修改的列表,比如说用List.unmodifiable创建的,作为List,如果用户试图在它上面调用add,将会得到一个运行时错误。

hxzsmxv2

hxzsmxv24#

为了防止列表被修改,只需使用内置dart:collection库中的UnmodifiableListView

import 'package:collection/collection.dart';

List<int> protectedNumbersUntil4() {
  return UnmodifiableListView([0, 1, 2, 3, 4]);
}

final numbers = protectedNumbersUntil4();
numbers.add(5); // throws
1wnzp6jl

1wnzp6jl5#

您应该使用IListpackage: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

相关问题