【问题标题】:Pass state variable reference to function将状态变量引用传递给函数
【发布时间】:2019-08-20 11:24:00
【问题描述】:

我想重用一个函数来更新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)
    )
  }
}

setState 函数中成功设置了状态,但不幸的是,UI 中没有表示状态更改,即没有再次调用build 函数。

我在这里的期望是应该更新stateVariable,因为我通过引用将变量传递给update 函数。这个假设是错误的吗?

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

【问题讨论】:

标签: flutter dart


【解决方案1】:

是的,假设是错误的。 Dart 不能通过引用传递变量,所有参数都是按值传递的。 (对象值实际上是对象引用,但这是对“引用”一词的单独且不相关的用法,并且将对象作为参数传递确实会按值传递对象引用)。​​

如果你想传递一些允许被调用者改变变量值的东西,你应该传递一个“setter function”:

void update(void setVariable(String value)) {
   setState(() {
     setVariable('updated value');
   });
}
...
   update((value) { stateVariable = value; });

没有办法“撕掉”一个setter,所以你必须把函数写出来。

【讨论】:

    【解决方案2】:

    我接受了Irn 的回答,并想分享我最终使用的解决方案。

    Future<String> update() async {
      ... // Do some async stuff here.
      return Future.value('updated value');
    }
    ...
    update().then((value) => setState(() { stateVariable = value });
    

    它消除了在update 函数中更新状态的必要性。这并不能回答我的问题,但我相信这是一种更优雅的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多