gpt4 book ai didi

dart - 为什么在 Flutter 中列表项不保存对 Dart 中变量的引用?

转载 作者:IT王子 更新时间:2023-10-29 07:11:40 26 4
gpt4 key购买 nike

假设我有一些 bool 自动验证变量:

  bool _autoValidateEmail = false;
bool _autoValidateCompanyName = false;
bool _autoValidatePhoneNo = false;
bool _autoValidateName = false;
bool _autoValidateSurname = false;

然后我想把它们放在一个列表中。我在 initState() 中这样做:

autoValidateList.addAll([
_autoValidateEmail,
_autoValidateCompanyName,
_autoValidatePhoneNo,
_autoValidateName,
_autoValidateSurname
]);

在运行时,值会像这样发生变化,例如

setState(() {
autoValidateList[0] = false;
});

但是如果我像这样设置 TextFormField 的值 autovalidate: _autoValidateEmail, 它不会更新。但是,如果我这样设置它:autovalidate: autoValidateList[1], 它工作正常。

那么为什么列表中的引用值没有在小部件树中更新?直接设置时=> autovalidate: _autoValidateEmail,?

最佳答案

Dart 中的一切都是Object,所有变量本质上都是对Object 的引用。当你这样做时:

var myList = [variable1, variable2, variable3];

您正在创建一个 List,它引用了一堆 Object。您的 List 没有对 variable1variable2 等的引用。

也就是说,你有:

variable1 ----> object1 <---- myList[0]
variable2 ----> object2 <---- myList[1]
variable3 ----> object3 <---- myList[2]

(请注意,这实际上与 List 没有任何关系。如果您这样做:

var variable2 = variable1;

你会有相同的行为:重新分配 variable2 不会改变 variable1 所指的内容。)

当你设置 myList[0] = somethingElse 时,你会得到:

variable1 ----> object1       myList[0] ----> somethingElse
variable2 ----> object2 <---- myList[1]
variable3 ----> object3 <---- myList[2]

您不能对 myList[0] 进行赋值来更改 variable1 的赋值。但是,您可以使 variable1myList[0] 引用相同的 Object,您可以改变。例如:

class Wrapper<T> {
Wrapper(this.value);
T value;
}

final variable1 = Wrapper<bool>(true);
final myList = [variable1, ...];

现在,如果您执行 myList[0].value = falsevariable1.value 也将是 false

关于dart - 为什么在 Flutter 中列表项不保存对 Dart 中变量的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56021221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com