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

时间:2020-01-12 08:20:37

标签: flutter

Home Page

我是扑朔迷离的,我正在构建一个示例应用程序来学习它。在上面的屏幕截图中,我创建了多个小部件。我的主窗口小部件包含以下窗口小部件。

  1. 男孩女孩选择器
  2. 普通卡
    1. CounterButton(加号或减号)
  3. 计算按钮

我的主窗口小部件有两个计数器-年龄和体重。 CommonCard具有以下属性: gainFunction():我从MainWidget设置此值,如下所示。 decrementFunction()

  ageIncrement() {
    setState(() {
      age++;
    });
  }
  ageDecrement() {
    setState(() {
      age--;
    });
  }

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

CounterButton具有以下属性。 onPressed:父小部件的增量或减量功能通过卡小部件传递到此处。

如果我将整个代码保留在主窗口小部件中,则它可以正常工作。但是,如果我创建了多个窗口小部件并在子窗口小部件onPressed上将递增和递减函数作为参数传递,则加号和减号无法正常工作。请分享您的想法。我缺少子代与父代小部件之间进行通信的一些基础知识。

1 个答案:

答案 0 :(得分:2)

有多种不同的状态管理技术,例如依赖注入,ChangeNotifier,BLoC等,可以通过多种方式来实现自己的目标(搜索Flutter State Management以获得更多详细信息)。

这是一个如何通过著名的反例实现此目标的示例。这个例子使用依赖注入(我们将增量函数作为回调函数传递给子窗口小部件)。您可以复制代码并将其粘贴在DartPad上以快速对其进行测试并查看其工作方式:

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

我希望能有所帮助。