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

Flutter 颤振-从一个有状态小部件到另一个有状态小部件的变量的设置值,flutter,widget,Flutter,Widget,我不熟悉flutter,这可能是一个非常不明确的问题,但我想从另一个有状态小部件设置一个有状态小部件变量的状态 分享一个小片段,重现我面临的问题 飞镖 class FirstWidget extends StatefulWidget { @override _FirstWidgetState createState() => _FirstWidgetState(); } class _FirstWidgetState extends State<FirstWidget>

我不熟悉flutter,这可能是一个非常不明确的问题,但我想从另一个有状态小部件设置一个有状态小部件变量的状态

分享一个小片段,重现我面临的问题

飞镖

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
);
  }
}
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. 
);

  }
}

class FirstWidget扩展了StatefulWidget{
@凌驾
_FirstWidgetState createState()=>\u FirstWidgetState();
}
类_FirstWidgetState扩展了状态{
bool _isDisabled=true;
@凌驾
小部件构建(构建上下文){
返回容器(
//用国旗做某事是不允许的
);
}
}
飞镖

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
);
  }
}
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. 
);

  }
}

class SecondWidget扩展了StatefulWidget{
@凌驾
_SecondWidgetState createState()=>\u SecondWidgetState();
}
类_SecondWidgetState扩展状态{
@凌驾
小部件构建(构建上下文){
返回容器(
//这里我想更新第一个小部件的isDisabled标志。
);
}
}
我基本上只是想知道如何从一个小部件更新另一个小部件的变量值


谢谢

要实现这一点,您可以使用
GlobalKey
GlobalKey
用于识别小部件树中的特定小部件

用法示例:

在FirstWidget.dart文件中:

class FirstWidget扩展了StatefulWidget{
@凌驾
FirstWidgetState createState()=>FirstWidgetState();
}
//确保您的FirstWidgetState类不是私有的!
类FirstWidgetState扩展了状态{
bool _isDisabled=true;
无效启用(布尔值){
设置状态(()=>_isDisabled=!value);
}
@凌驾
小部件构建(构建上下文){
返回容器(
//用国旗做某事是不允许的
);
}
}
在SecondWidget.dart文件中(我对该文件做了一些更改,以显示
GlobalKey
的用法):

final GlobalKey firstwidgetlobalkey=new GlobalKey();
类SecondWidget扩展了StatefulWidget{
@凌驾
_SecondWidgetState createState()=>\u SecondWidgetState();
}
类_SecondWidgetState扩展状态{
@凌驾
小部件构建(构建上下文){
返回容器(
子:列(
儿童:[
第一小部件(
关键字:firstWidgetGlobalKey,
),
升起的按钮(
已按下:(){
firstWidgetGlobalKey.currentState.enable(true);
},
子项:文本(“启用第一个小部件”),
),
],
),
);
}
}

编辑

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

缺点(但这是一种预期行为)是,只有当它标识的小部件当前在小部件树中时,
GlobalKey
才能使用,否则您将在
currentState
上获得空引用

从另一个小部件访问小部件状态的另一种方法是使用。因为它需要更多的努力,所以有一个非常简单的教程展示了它的用法:


希望这会有帮助

感谢您提供简单快捷的解决方案。我有一个问题,虽然我将在许多地方使用第二个小部件。这里可能有很多这样的值需要更新。那么,我是否应该创建所有其他小部件的全局键,我可能会在这里更新这些小部件的值,或者是否有其他方法可以做到这一点?