我有一个带按钮的StatefulWidget,它用Navigator.push()导航到另一个StatefulWidget.在第二个小部件上,我正在更改全局状态(一些用户首选项).当我从第二个小部件返回到第一个小部件时,使用Navigator.pop(),第一个小部件处于旧状态,但我想强制它重新加载.你知道怎么做吗?我有一个 idea ,但它看起来很难看:

  1. 弹出以删除第二个小部件(当前小部件)
  2. 再次弹出以删除第一个小部件(上一个)
  3. Push First Widget(应强制重画)

推荐答案

你可以在这里做几件事.@mahi的答案虽然正确,但可能会更简洁一些,实际上使用的是Push,而不是操作员询问的showDialog.以下是使用Navigator.push的示例:

import 'package:flutter/material.dart';

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.green,
      child: Column(
        children: <Widget>[
          RaisedButton(
            onPressed: () => Navigator.pop(context),
            child: Text('back'),
          ),
        ],
      ),
    );
  }
}

class FirstPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new FirstPageState();
}

class FirstPageState extends State<FirstPage> {

  Color color = Colors.white;

  @override
  Widget build(BuildContext context) {
    return new Container(
      color: color,
      child: Column(
        children: <Widget>[
          RaisedButton(
            child: Text("next"),
            onPressed: () async {
              final value = await Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => SecondPage()),
                ),
              );
              setState(() {
                color = color == Colors.white ? Colors.grey : Colors.white;
              });
            },
          ),
        ],
      ),
    );
  }
}

void main() => runApp(
      MaterialApp(
        builder: (context, child) => SafeArea(child: child),
        home: FirstPage(),
      ),
    );

然而,还有另一种方法可以很好地满足您的用例.如果你使用global作为影响第一页构建的东西,你可以使用InheritedWidget来定义你的全局用户首选项,每次更改它们时,你的第一页都会重建.这甚至可以在如下所示的无状态小部件中工作(但也应该在有状态小部件中工作).

Ffltter中的InheritedWidget的一个例子是应用程序的主题,尽管他们在一个小部件中定义了它,而不是像我这里那样直接构建它.

import 'package:flutter/material.dart';
import 'package:meta/meta.dart';

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.green,
      child: Column(
        children: <Widget>[
          RaisedButton(
            onPressed: () {
              ColorDefinition.of(context).toggleColor();
              Navigator.pop(context);
            },
            child: new Text("back"),
          ),
        ],
      ),
    );
  }
}

class ColorDefinition extends InheritedWidget {
  ColorDefinition({
    Key key,
    @required Widget child,
  }): super(key: key, child: child);

  Color color = Colors.white;

  static ColorDefinition of(BuildContext context) {
    return context.inheritFromWidgetOfExactType(ColorDefinition);
  }

  void toggleColor() {
    color = color == Colors.white ? Colors.grey : Colors.white;
    print("color set to $color");
  }

  @override
  bool updateShouldNotify(ColorDefinition oldWidget) =>
      color != oldWidget.color;
}

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var color = ColorDefinition.of(context).color;

    return new Container(
      color: color,
      child: new Column(
        children: <Widget>[
          new RaisedButton(
              child: new Text("next"),
              onPressed: () {
                Navigator.push(
                  context,
                  new MaterialPageRoute(builder: (context) => new SecondPage()),
                );
              }),
        ],
      ),
    );
  }
}

void main() => runApp(
      new MaterialApp(
        builder: (context, child) => new SafeArea(
              child: new ColorDefinition(child: child),
            ),
        home: new FirstPage(),
      ),
    );

如果您使用继承的小部件,则不必担心您推送的页面会弹出,这在基本用例中是有效的,但在更复杂的场景中可能会出现问题.

Flutter相关问答推荐

Flutter iOS日期 Select 器UI中限制日期范围?

如何在应用栏中将列置于中心

build_runner显示错误没有为类ClassDeclaration定义getter宏关键字'

Flutter 蜂窝单元测试

将CLOUD_FIRESTORE程序包更新到版本4.13.0(到Windows)时出现问题

如何确定Flutter 中的文本 colored颜色 ?

为什么我的Flutter 动画过渡没有发生?

Flutter Xcode 15 错误(Xcode):DT_TOOLCHAIN_DIR 无法用于判断 LIBRARY_SEARCH_PATHS

如何在 Flutter 中创建具有渐变背景色的自定义 Snackbar?

带有命名参数的回调函数不起作用

即使小部件比Flutter 中的屏幕更宽,也始终显示滚动条

为 flutter app/firebase 保存 chatgpt api-key 的正确方法是什么

在 Flutter 中解码 BLE 设备负载

Flutterfire Configure - 未处理的异常和没有 firebase 初始化

如何在向下滚动时隐藏顶部卡片并在向上滚动时出现?

如何根据应用程序主题(深色和浅色)更改谷歌 map 的主题?

在 Flutter 中,您什么时候应该更喜欢Widget继承而不是组合?

gridview 的所有按钮都应该在Flutter 中适合其父容器

Flutter Firestore 数据库排序最近 24 小时内最喜欢的文档

带有 Dismissible 和 Provider (NotifyListener) 的笨拙动画