我想重用一个函数来更新2D
的不同状态变量。更新哪个状态变量应取决于作为参数传递给函数的变量引用。这是一些示例代码:
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)
)
}
}
函数中成功设置了状态,但是不幸的是,状态更改未在UI中表示,即,setState
函数没有被再次调用。
我的期望是build
应该被更新,因为我通过引用将变量传递给stateVariable
函数。这个假设是错误的吗?
您知道一种通过引用传递状态变量的方法,以便可以通过函数对其进行幂等更新吗?
答案 0 :(得分:3)
是,假设为假。 Dart无法通过引用传递变量,所有参数都按值传递。 (对象值实际上是对象引用,但这是对“引用”一词的单独且不相关的使用,将对象作为参数传递确实会通过值通过传递对象引用)。
如果要传递允许被调用者更改变量值的内容,则应传递“ setter函数”:
void update(void setVariable(String value)) {
setState(() {
setVariable('updated value');
});
}
...
update((value) { stateVariable = value; });
无法“撕下”设置器,因此您必须将函数写出。
答案 1 :(得分:0)
我接受了Irn
的答案,并希望分享我最终使用的解决方案。
Future<String> update() async {
... // Do some async stuff here.
return Future.value('updated value');
}
...
update().then((value) => setState(() { stateVariable = value });
它消除了在update
函数中更新状态的必要。这不能回答我的问题,但是我相信这是一种更为优雅的方式。