将状态变量引用传递给函数

时间:2019-08-20 11:24:00

标签: flutter dart

我想重用一个函数来更新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函数。这个假设是错误的吗?

您知道一种通过引用传递状态变量的方法,以便可以通过函数对其进行幂等更新吗?

2 个答案:

答案 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函数中更新状态的必要。这不能回答我的问题,但是我相信这是一种更为优雅的方式。