【问题标题】:Change parent variable and rebuild parent widget when child widget changes Flutter当子部件更改 Flutter 时更改父变量并重建父部件
【发布时间】:2020-04-03 11:57:02
【问题描述】:

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

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

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

这是我的自定义小部件

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 包,因为它只重建子小部件而不是父小部件。

那你有什么建议呢?

谢谢

【问题讨论】:

    标签: flutter dart state-management


    【解决方案1】:

    您可以在 CustomWidget onFlatButtonPressed 中创建一个文件。该字段将是回调函数或 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),
            ],
          ),
        );
      }
    }
    

    【讨论】:

    • 正是我需要的。谢谢你:)
    • @Josteve 我遇到了同样的问题并用相同的架构解决了。但是,我不明白为什么我们使用属性widget.myvariable,而不是将其从扩展StatefulWidget 的类MyCustomWidget 传递到扩展State&lt;MyCustomWidget&gt; 的类_MyCustomWidget。这就是我正在做的,但没有任何成功。为什么widget.myvariable 可以代替?
    猜你喜欢
    • 2023-01-13
    • 1970-01-01
    • 2021-06-29
    • 2021-06-27
    • 2020-04-14
    • 2019-07-02
    • 1970-01-01
    • 2017-11-03
    • 2020-07-25
    相关资源
    最近更新 更多