我有一个 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

10-07 19:41
查看更多