dart - 如何从另一个小部件设置状态?

标签 dart flutter

我正在尝试从 Flutter 中的不同小部件更改状态。例如,在以下示例中,我在几秒钟后设置状态。

下面是代码:

class _MyAppState extends State<MyApp> {

  int number = 1;

  @override
  void initState() {
    super.initState();
    new Future.delayed(new Duration(seconds: 5)).then((_) {
      this.setState(() => number = 2);
      print("Changed");
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Center(
        child: new FlatButton(
          color: Colors.blue,
          child: new Text("Next Page"),
          onPressed: () {
            Navigator.of(context).push(new MaterialPageRoute(
              builder: (BuildContext context) => new StatefulBuilder(builder: (BuildContext context, setState) =>new MySecondPage(number))
            ));
          },
        ),
      ),
    );
  }
}

我尝试使用 InheritedWidget,但除非我将它包裹在我的顶级小部件周围,否则这将不起作用,这对于我正在尝试做的事情是不可行的(上面的代码是简化我想要实现的目标)。

关于在 Flutter 中实现这一目标的最佳方式有什么想法吗?

最佳答案

尽可能避免这种情况。它使这些小部件相互依赖,并且从长远来看会使事情变得更难维护。

您可以做的是让两个小部件共享一个公共(public) Listenable或类似的东西,例如 Stream .然后小部件通过提交事件相互交互。

为了方便编写,还可以将Listenable/Stream分别与ValueListenableBuilder结合起来和 StreamBuilder两者都为你做监听/更新部分。

Listenable 的简单示例。

class MyHomePage extends StatelessWidget {
  final number = new ValueNotifier(0);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ValueListenableBuilder<int>(
        valueListenable: number,
        builder: (context, value, child) {
          return Center(
            child: RaisedButton(
              onPressed: () {
                number.value++;
              },
              child: MyWidget(number),
            ),
          );
        },
      ),
    );
  }
}

class MyWidget extends StatelessWidget {
  final ValueListenable<int> number;

  MyWidget(this.number);

  @override
  Widget build(BuildContext context) {
    return new Text(number.value.toString());
  }
}

请注意,我们如何在执行 number.value++ 时自动更新 UI,而无需调用 setState

关于dart - 如何从另一个小部件设置状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50430273/

相关文章:

flutter - 如何根据条件变化更改小部件的颜色

android - 如何在flutter中删除AR核心节点

android - 如何在水平ListView的右边缘添加模糊效果以显示内容较多

authorization - 使用 Dart 的 Google Plus API - 状态 401,授权问题

flutter - Flutter中的复选框

flutter - dart/flutter 使用 sudo 运行进程

local-storage - 使用 Dart 的 Chrome 应用程序中的本地存储

android - 如何在一个 slider 上添加多个 slider ? # flutter

flutter 和 Dart : How to check/know which class has called a function?

flutter - Flutter 中的表格对齐?