Flutter-从另一个有状态小部件设置一个有状态小部件的变量的值

时间:2020-04-18 11:13:38

标签: flutter widget

我是新手,这可能是一个非常棘手的问题,但我想从另一个有状态小部件设置一个有状态小部件的变量状态。

共享一个再现问题的小片段。

FirstWidget.dart

class FirstWidget extends StatefulWidget {
  @override
  _FirstWidgetState createState() => _FirstWidgetState();
}

class _FirstWidgetState extends State<FirstWidget> {

bool _isDisabled = true; 

 @override
  Widget build(BuildContext context) {
    return Container(
               // Doing Something with the flag isDisabled
);
  }
}

SecondWidget.dart

class SecondWidget extends StatefulWidget {
  @override
  _SecondWidgetState createState() => _SecondWidgetState();
}

class _SecondWidgetState extends State<SecondWidget> {

 @override
  Widget build(BuildContext context) {
    return Container(
        // Here I want to update the isDisabled Flag of the First Widget. 
);

  }
}

我基本上只是想知道如何从另一个小部件更新一个小部件的变量值。

谢谢

1 个答案:

答案 0 :(得分:1)

要实现此目的,您可以使用GlobalKeyGlobalKey用于标识窗口小部件树中的特定窗口小部件。

用法示例:

在FirstWidget.dart文件中:

class FirstWidget extends StatefulWidget {
  @override
  FirstWidgetState createState() => FirstWidgetState();
}

// Make sure your FirstWidgetState class is not private!
class FirstWidgetState extends State<FirstWidget> {

  bool _isDisabled = true;

  void enable(bool value) {
    setState(() => _isDisabled = !value);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      // Doing Something with the flag isDisabled
    );
  }
}

在SecondWidget.dart文件中(我对此文件做了一些更改以显示GlobalKey的用法):

final GlobalKey<FirstWidgetState> firstWidgetGlobalKey = new GlobalKey<FirstWidgetState>();

class SecondWidget extends StatefulWidget {
  @override
  _SecondWidgetState createState() => _SecondWidgetState();
}

class _SecondWidgetState extends State<SecondWidget> {

 @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: <Widget>[
          FirstWidget(
            key: firstWidgetGlobalKey,
          ),
          RaisedButton(
            onPressed: () {
              firstWidgetGlobalKey.currentState.enable(true);
            },
            child: Text("Enable First Widget"),
          ),
        ],
      ),
    );
  }
}

编辑

GlobalKey实例在整个应用程序中应唯一。因此,使用全局密钥的一种更明智的方法是将所有全局密钥存储在单独的文件中(例如keys.dart)。在此文件中,您可以将firstWidgetGlobalKeysecondWidgetGlobalKey作为最终变量,只需导入文件即可使用它们。

不利的一面(但这是预期的行为)是GlobalKey仅在其标识的小部件当前在小部件树中存在时可以使用,否则您将获得currentState上的空引用。

从另一个窗口小部件访问状态的另一种方法是使用InheritedWidget。由于需要更多的努力,因此有一个很好的简单教程显示了用法:InheritedWidget Tutorial on Medium

希望这会有所帮助!