DART文档显示:

如果您从不打算更改变量,请使用FINAL或CONST 而不是变量,或者除了类型之外.可以设置最终变量 只有一次;

好的,这意味着第二次赋值最后一个变量将不起作用,but不起作用 说的是修改,也就是说修改.

void main() {
  final List<int> list = [1,2,3];  

  list = [10, 9, 8]; //error!

  list
  ..clear()
  ..addAll([10, 9, 8]); //works!
}

正如大家可以看到的,本质上,i re-赋值了最终变量list.它不是与最终变量的整个概念相矛盾吗?

推荐答案

final不等于deep final.

即使在修改列表内容时,list变量仍引用相同的列表实例.任何可变实例都可以修改,即使它被赋给了最终变量. 想象一下

void main() {
  var l = [1,2,3];
  final List<int> list = l;  
}

现在,您将无法修改由l引用的列表中的项,因为该列表还被分配给最终字段list(listl都引用同一列表).那也太没道理了.

要使列表不可变,您可以做的是

final List<int> list = const[1,2,3];  

现在,您不能将另一个列表分配给list,也不能修改list引用的列表的内容.

另一种方式

  import 'dart:collection'
  ...
  var l = [1,2,3];
  final List<int> list = UnmodifiablyListView(l);

Now you can't modify list or the contents of the list referenced by list but you can modify the contents referenced by l (list would reflect the changes made to l).
If you loose the reference to l you have no way of modifying the contents.

  var l = [1,2,3];
  final List<int> list = UnmodifiablyListView(l);
  l = null;

例如,当您想要确保list字段永远不会设置为null时,final很好.

class MyModel {
  final list = [];
}

list字段是公共的,但是没有人可以将list设置为例如null.

var model = new MyModel();
...
model.list.forEach(print);

will never fail with an exception like null doesn't have a method 'forEach'.
This is similar but more concise than

class MyModel {
  var _list = [];
  List get list => _list;
}

Dart相关问答推荐

观察对象的状态

Flutter - 对 Cloud Firestore 进行排序

默认情况下不可为空(Non-nullable ):如何启用experiment?

如何在 Flutter 中将 textEditiing 控制器与 Provider 一起使用

如何使用 Dart 分析器从源代码生成 AST 并使用 AST?

Flutter ButtonRow 填充

我需要在使用之前将我的 Dart 包发布到 pub.dartlang.org 吗?

谷歌dart Regions?

如何在命令行上创建和运行Dart元素

未定义命名参数child.在 Center() 构造函数中

将Dart嵌入到应用程序中

Flutter 示例中的流布局

如何更改手机屏幕上的Flutter应用程序名称显示?

如何左对齐 Flutter 中的 OutlineButton 图标

如何将整数中的ascii值转换为Flutter中的等效字符?

Dart 构造函数与静态方法;例如,为什么 int.parse() 不是工厂构造函数?

Dart 的服务器端框架

如何以 Dart 语言将变量完全转储/打印到控制台?

如何在 Dart 中扁平化map列表?

dart 折叠(Fold)与减少(Reduce)