我想重用一个函数来更新StatefulWidget
. 更新哪个状态变量应取决于作为参数传递给函数的变量引用。这是一些示例代码:
class _MyScreenState extends State<MyScreen> {
String stateVariable = 'initial value';
void update(String variableRef) {
setState((() {
variableRef = 'updated value';
})
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => update(stateVariable),
child: Text(stateVariable)
)
}
}
Run Code Online (Sandbox Code Playgroud)
函数中状态设置成功setState
,但遗憾的是状态变化并未在 UI 中体现,即build
函数未再次调用。
我的期望是应该更新,因为我通过引用stateVariable
将变量传递给函数。update
这个假设是错误的吗?
您知道一种通过引用传递状态变量以便可以通过函数幂等更新它的方法吗?
是的,假设是错误的。Dart 不能通过引用传递变量,所有参数都通过值传递。(对象值实际上是对象引用,但这是“引用”一词的单独且不相关的使用,并且将对象作为参数传递确实按值传递对象引用)。
如果你想传递一些允许被调用者更改变量值的东西,你应该传递一个“setter 函数”:
void update(void setVariable(String value)) {
setState(() {
setVariable('updated value');
});
}
...
update((value) { stateVariable = value; });
Run Code Online (Sandbox Code Playgroud)
没有办法“撕掉”setter,所以你必须把函数写出来。