【问题标题】:Flutter - Pass state change function to child widget and update stateFlutter - 将状态更改功能传递给子小部件并更新状态
【发布时间】:2020-04-29 07:25:43
【问题描述】:

我是 Flutter 的新手,并构建了一个示例应用程序来学习它。在上面的屏幕截图中,我创建了多个小部件。我的主要小部件包含以下小部件。

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

我的主要小部件有两个计数器 - 年龄和体重。 CommonCard 具有以下属性: incrementFunction() :我从 MainWidget 设置这个值,如下所示。 递减函数()

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

value : 在主窗口小部件中声明的年龄被传递给这个值。

CounterButton 具有以下属性。 onPressed: 父小部件的递增或递减函数通过卡片小部件在这里传递。

如果我将整个代码保留在主小部件中,那么它可以正常工作。但是,如果我创建多个小部件并将增量和减量函数作为子小部件中的参数传递,则 onPressed on plus 和 minus 无法正常工作。请分享你的想法。我错过了子小部件和父小部件之间的一些基本通信。

【问题讨论】:

  • 那么,您的小部件树又如何了? Column(children: [ Row(children: [BoyGirlSelector(), BoyGirlSelector(),],), Row(children: [Card(), Card(),],), CalculateWeightButton(),],) 你可以声明MainWidget 中的所有方法和变量然后很容易将其传递给您的小部件。

标签: flutter


【解决方案1】:

有多种不同的方法可以实现您喜欢的目标,因为有几种不同的状态管理技术,例如 Dependency Injection、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);
  }
}

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2021-06-27
    • 2020-03-18
    • 2021-11-02
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多