Flutter 颤振-将状态更改功能传递给子窗口小部件并更新状态

Flutter 颤振-将状态更改功能传递给子窗口小部件并更新状态,flutter,Flutter,我是一个新的颤振和建立一个样本应用程序来学习它。在上面的屏幕截图中,我创建了多个小部件。我的主小部件包含以下小部件 男孩女孩选择器 普通卡 计数器按钮(加号或减号) 计算按钮 我的主要部件有两个计数器-年龄和体重。 CommonCard具有以下属性: incrementFunction():我正在从MainWidget设置此值,如下所示。 递减函数() 值:主窗口小部件中声明的年龄传递给此值 计数器按钮具有以下属性。 onPressed:来自父窗口小部件的递增或递减函数通过卡窗口小部件传递到这

我是一个新的颤振和建立一个样本应用程序来学习它。在上面的屏幕截图中,我创建了多个小部件。我的主小部件包含以下小部件

  • 男孩女孩选择器
  • 普通卡
  • 计数器按钮(加号或减号)
  • 计算按钮
  • 我的主要部件有两个计数器-年龄和体重。 CommonCard具有以下属性: incrementFunction():我正在从MainWidget设置此值,如下所示。 递减函数()

    值:主窗口小部件中声明的年龄传递给此值

    计数器按钮具有以下属性。 onPressed:来自父窗口小部件的递增或递减函数通过卡窗口小部件传递到这里


    若我将整个代码保存在主窗口小部件中,那个么它工作正常。但若我创建了多个小部件,并将递增和递减函数作为子部件中的参数传递,那个么按下加号和减号将无法正常工作。请分享你的想法。我缺少一些基本的子部件和父部件之间的通信。

    有不同的方法来实现您想要的,因为有两种不同的状态管理技术,如依赖项注入、变更通知程序、BLoC等(有关更多详细信息,请搜索颤振状态管理)

    下面是一个如何在著名的反例中实现这一点的示例。这个示例使用依赖项注入(我们将增量函数作为回调函数传递给子小部件)。您可以复制代码并将其传递,以快速测试代码并查看其工作原理:

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          debugShowCheckedModeBanner: false,
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.display1,
                ),
                SizedBox(height: 50),
                MySecondButton(secondButtonIncrement: incrementCounter),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    
    class MySecondButton extends StatelessWidget {
      MySecondButton({Key key, this.secondButtonIncrement}) : super(key: key);
      final VoidCallback secondButtonIncrement;
    
      @override
      Widget build(BuildContext context) {
        return FlatButton(
            child: Text("Second Button"),
            onPressed: () {
              secondButtonIncrement();
            },
            color: Colors.blue);
      }
    }
    
    导入“包装:颤振/材料.省道”;
    void main()=>runApp(MyApp());
    类MyApp扩展了无状态小部件{
    @凌驾
    小部件构建(构建上下文){
    返回材料PP(
    标题:“颤振演示”,
    debugShowCheckedModeBanner:false,
    主题:主题数据(
    主样本:颜色。蓝色,
    ),
    主页:MyHomePage(标题:“颤振演示主页”),
    );
    }
    }
    类MyHomePage扩展StatefulWidget{
    MyHomePage({Key,this.title}):超级(Key:Key);
    最后的字符串标题;
    @凌驾
    _MyHomePageState createState()=>\u MyHomePageState();
    }
    类_MyHomePageState扩展状态{
    int _计数器=0;
    void incrementCounter(){
    设置状态(){
    _计数器++;
    });
    }
    @凌驾
    小部件构建(构建上下文){
    返回脚手架(
    appBar:appBar(
    标题:文本(widget.title),
    ),
    正文:中(
    子:列(
    mainAxisAlignment:mainAxisAlignment.center,
    儿童:[
    正文(
    “您已经按了这么多次按钮:”,
    ),
    正文(
    “$”计数器“,
    样式:Theme.of(context).textTheme.display1,
    ),
    尺寸箱(高度:50),
    MySecondButton(第二个按钮增量:递增计数器),
    ],
    ),
    ),
    浮动操作按钮:浮动操作按钮(
    按下:递增计数器,
    工具提示:“增量”,
    子:图标(Icons.add),
    ),
    );
    }
    }
    类MySecondButton扩展了无状态小部件{
    MySecondButton({Key-Key,this.secondButtonIncrement}):super(Key:Key);
    最终作废回拨第二按钮增量;
    @凌驾
    小部件构建(构建上下文){
    返回按钮(
    子项:文本(“第二个按钮”),
    已按下:(){
    第二个按钮增量();
    },
    颜色:蓝色);
    }
    }
    

    我希望这有帮助

    那么,你的小部件树怎么样了?列(子项:[行(子项:[BoyGirlSelector(),BoyGirlSelector(),],),行(子项:[Card(),Card(),],),CalculateWightButton()。
    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          debugShowCheckedModeBanner: false,
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.display1,
                ),
                SizedBox(height: 50),
                MySecondButton(secondButtonIncrement: incrementCounter),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    
    class MySecondButton extends StatelessWidget {
      MySecondButton({Key key, this.secondButtonIncrement}) : super(key: key);
      final VoidCallback secondButtonIncrement;
    
      @override
      Widget build(BuildContext context) {
        return FlatButton(
            child: Text("Second Button"),
            onPressed: () {
              secondButtonIncrement();
            },
            color: Colors.blue);
      }
    }