我有一个 flutter 的变量列表,一旦被调用将不再改变。问题是:我可以使该列表不变吗?
这是代码:
final number = new List<int>.generate(300, (i) => i + 1);
var rng = new Random();
final place = new List.generate(300, (_) => rng.nextInt(3));
final noteListStart = new List<Note>.generate(number.length, (i) => Note(number[i],place[i]));
final List<Note> noteListEnd = [
Note(300, -1), Note(301, -1),Note(302, -1),Note(303, -1)
];
final initList = List<Note>.from(noteListStart)..addAll(noteListEnd);
List<Note> initNotes1() {
return
initList;
}
在上面的示例中,initNotes1()在被调用后需要保持不变,因此我可以在代码的其他地方轻松使用它。
任何帮助,将不胜感激。
最佳答案
在这一点上,目前尚不清楚您的实际问题是什么。
从表面上看,您要问的是如何在运行时计算列表,然后在填充列表后将其转换为常量。答案是:您不能。
常量是在程序编译之前定义的显式值。根据定义,您不能根据计算或生成的值创建常量(除非从包含其他值的简单表达式中求值本身就是常量)。这意味着您无法创建一个充满随机值的常数列表-它与“常数”的整体含义相反。
(注意:此说明是Dart特有的,但在编译语言中也很常见。这与对解释性语言(例如Javascript)的“常量”的定义不同,后者使用const
关键字仅引用了不变变量。)
如果您不是要表示“常量”,而只是表示“不可变”,那么您会将列表标记为final
,这将实现相同的目的。作为额外的一项措施,您可以使用List.unmodifiable
创建列表,使其不受影响。
final rng = Random();
final _noteListStart = List.generate(startLength, (i) => Note(i + 1, rng.nextInt(3)));
final _noteListEnd = [
Note(300, -1), Note(301, -1),Note(302, -1),Note(303, -1)
];
List<Note> noteList = List.unmodifiable([..._noteListStart, ..._noteListEnd]);
但是,您要问的似乎不是如何使变量常量,而是如何使变量全局。这是一个既容易又难回答的问题。
这很容易,因为这样做非常简单。采取上述代码,重新排列一下,然后将其放入自己的dart文件中,然后您就可以导入它并在需要的地方使用它:
// notes_list.dart
final _noteListEnd = [
Note(300, -1), Note(301, -1),Note(302, -1),Note(303, -1)
];
List<Note> _initList(int startLength) {
final rng = Random();
final _noteListStart = List.generate(startLength, (i) => Note(i + 1, rng.nextInt(3)));
return List.unmodifiable([..._noteListStart, ..._noteListEnd]);
}
final List<Note> noteList = _initList(300);
// other_file.dart
import '/path/to/notes_list.dart';
void main() {
print(noteList);
}
(注意:导入是强制性的-您无法在Dart中使_truly_全局化,并且不需要导入。)
另一方面,这个问题很难回答,因为许多程序员都不赞成使用全局变量。它属于一类实践,会导致紧密耦合且难以测试的代码,进而导致程序几乎无法维护和发展。在许多情况下,全局变量可以完全由另一种做法代替,例如dependency injection。