flutter - 如何在 Flutter 中的不同有状态小部件之间向前和向后移动数据?

标签 flutter dart

第一个stateful widget中有count变量,我把它传给了Setting class。并且,Setting class 将其传递给SettingStateBuilder。然后,它的值在 SettingStateBuilderincrementing() 中改变。我希望更新后的值返回到 HomePageBody 以进行进一步的工作。我该怎么做?

第一个有状态小部件创建如下:

class HomePage extends StatefulWidget {
  @override
  HomePageBody createState() => HomePageBody();
}

class HomePageBody extends State<HomePage> {
   int count=0;
   @override
   Widget build(BuildContext context) {
       ...
       new Setting(count);
   }
}

第二个有状态小部件创建如下:

class Setting extends StatefulWidget {
   int count;
   Setting(this.count);

   @override
   SettingStateBuilder createState() => SettingStateBuilder(count);
}

class SettingStateBuilder extends State<Setting> {
   int count;
   SettingStateBuilder(this.count);
  
  @override
  Widget build(BuildContext context) {
    return new Container( 
       new Text(count.toString());
       ....
       onPressed: () => setState(() => incrementing(context))),
    );
  }
  incrementing(context) { count += 1; }
}

最佳答案

您可以将 Function 属性添加到 Settings 小部件,当计数器递增时将调用该属性,并在您创建小部件时传递该函数,因此在 HomePage 你可以更新计数器:

class HomePage extends StatefulWidget {
  @override
  HomePageBody createState() => HomePageBody();
}

class HomePageBody extends State<HomePage> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: <Widget>[
          MaterialButton(
            child: Text('Settings'),
            onPressed: () {
              Navigator.of(context).push(
                MaterialPageRoute(
                  builder: (BuildContext context) => Settings(
                        count,
                        (newCount) {
                          setState(
                            () {
                              count = newCount;
                            },
                          );
                        },
                      ),
                ),
              );
            },
          )
        ],
      ),
      body: Center(
        child: Text('$count'),
      ),
    );
  }
}

class Settings extends StatefulWidget {
  final int count;
  final Function(int) onCounterChanged;

  Settings(this.count, onCounterChanged);

  @override
  SettingsStateBuilder createState() => SettingsStateBuilder(count);
}

class SettingsStateBuilder extends State<Settings> {
  int count;
  SettingsStateBuilder(this.count);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('$count'),
            MaterialButton(
              child: Text('Increment'),
              onPressed: () => setState(
                    () {
                      increment();
                    },
                  ),
            ),
          ],
        ),
      ),
    );
  }

  increment() {
    count += 1;
    widget.onCounterChanged(count);

  }
}

如果您正在处理更复杂的用例,我建议您阅读有关如何在 Flutter 中进行状态管理的一些资源:

https://flutter.dev/docs/development/data-and-backend/state-mgmt/intro https://flutter.dev/docs/development/data-and-backend/state-mgmt/options

关于flutter - 如何在 Flutter 中的不同有状态小部件之间向前和向后移动数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56807965/

相关文章:

firebase - 在 Dart 中返回一个整数

flutter - Flutter:从另一个小部件更改主题亮度

function - Flutter,如何减少重复的widget

android - Flutter - 从 Flutter 项目目录而不是从 Android 项目目录获取 64K 方法 DEX 错误

react-native - 我应该使用什么语言为已经具有功能齐全的 webapp 和 api 的项目构建跨平台移动应用程序?

xcode - Flutter:命令 PhaseScriptExecution 失败,退出代码非零

flutter - 火存储 : multiple where()'s and orderBy()

firebase - 在 initState() flutter 中使用异步方法

flutter - 如何实现这一目标?

dart - 有没有办法在 Rikulo 中使用支持 Builder 模式?