更改父变量并在子窗口小部件更改Flutter时重建父窗口小部件

时间:2020-04-03 11:57:02

标签: flutter dart state-management

我有一个屏幕小部件和一个自定义小部件。我想在按下自定义窗口小部件的按钮时更改屏幕窗口小部件的值。只是为了举例;

这是MyScreen小部件,它使用CustomWidget作为子级:

import './widgets/my_custom_widget.dart';
class MyScreen extends StatefulWidget {

  @override
  _MyScreen createState() => _MyScreenState();
}

class _MyScreen extends State<MyScreen> {
 bool isChildButtonPressed = false;
  @override
  Widget build(BuildContext context) {
    return Container(
         child:MyCustomWidget());
    }
}

这是MyCustomWidget

class MyCustomWidget extends StatefulWidget {

  @override
  _MyCustomWidget createState() => _MyCustomWidget();
}

class _MyCustomWidget extends State<MyCustomWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(
        width:200,
        height:200,
         child: Row(children:[
                  FlatButton(child:Text("I am child button"),onPressed:(){
                     //what should I do here to change MyScreen isChildButtonPressed to true? 

                       }),
                  ]
             )
        );
    }
}

上面的代码仅是我要实现的示例,但在我的应用中,我有一个较长的子窗口小部件多个按钮,并且我希望将窗口小部件存储在单独的文件中,但是我想更改父代的一些变量子控件的按钮被按下时的控件。

我可以做的是将父级变量声明为全局变量,然后使用ValueNotifier,但我认为这不是解决此问题的好方法,因为我只需要在一个屏幕上而不是整个应用程序中使用这些变量。

我认为我不能使用Provider软件包,因为它仅重建子窗口小部件而不重建父窗口小部件。

那你有什么建议?

谢谢

1 个答案:

答案 0 :(得分:1)

您可以在 CustomWidget onFlatButtonPressed中创建文件。该字段将为Callback Function或VoidCallBack,然后在您按下 CustomWidget 中的扁平按钮时调用该函数,并在** MyScreen *

中定义该函数

class MyScreen extends StatefulWidget {
  @override
  _MyScreenState createState() => _MyScreenState();
}

class _MyScreenState extends State<MyScreen> {
  bool isChildButtonPressed = false;

  @override
  Widget build(BuildContext context) {
    return Container(
      child: MyCustomWidget(
        onFlatButtonPressed: (){
          setState(() {
            //Write what you want to do here
          });
        },
      ),
    );
  }
}

class MyCustomWidget extends StatefulWidget {
  final VoidCallback onFlatButtonPressed;

  MyCustomWidget({@required this.onFlatButtonPressed});

  @override
  _MyCustomWidget createState() => _MyCustomWidget();
}

class _MyCustomWidget extends State<MyCustomWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(
      width: 200,
      height: 200,
      child: Row(
        children: [
          FlatButton(child: Text("I am child button"), onPressed: widget.onFlatButtonPressed),
        ],
      ),
    );
  }
}