Flutter:如何使用导航器堆栈中的数据恢复屏幕

Flutter : How to recover a screen with data in the Navigator stack

我正在做一个销售应用,我在其中使用抽屉通过导航器命令在屏幕之间移动,发现以下情况

1 - 打开应用程序时,它会进入进行销售的主屏幕

2 - 我select两个产品要卖

3 - 在我离开包含这两种产品的销售屏幕并转到客户屏幕后立即

4 - 现在我需要回到销售屏幕,已经 selected 的两个产品应该还在

好的,在第 4 部分中,使用键返回单元格 phone 它 returns 一个屏幕并转到此销售屏幕(那里有两个产品),但是如果我进入抽屉并 select 进入销售屏幕的选项,我如何在堆栈的开头搜索此屏幕而不是创建一个新的销售屏幕(没有这两种产品时它是空的)。我想要这个,因为如果堆栈顶部只有一个屏幕,没问题,用户按下返回即可,但如果顶部有 5 或 6 个屏幕,这对用户必须返回所有内容,在背面按几次,以免丢失销售屏幕上已经制作的内容。是否有任何导航器命令可以执行此操作?我已经在寻找一些东西,但没有找到对我有帮助的东西。

抽屉密码

 @override
  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    return MultiLevelDrawer(
            backgroundColor: Color(0xfff0f3f4),
            rippleColor: Colors.white,
            subMenuBackgroundColor: Color(0xfff0f3f4),
            divisionColor: Colors.grey,
            header: Container(
              height: size.height * 0.25,
              child: Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                  Image.asset(
                  "Imagens/ACMIL_CIRCULAR.png",
                  width: 100,
                  height: 100,
                ),
                SizedBox(
                  height: 10,
                ),
                Text("Usuario : Iury")
              ],
            )),
            ),
            children: [
            MLMenuItem(
                leading: Icon(Icons.person),
                trailing: Icon(Icons.arrow_right),
                content: Text(
                  "Cadastro",
                ),
                subMenuItems: [
                  MLSubmenu(
                      onClick: () {
                        Navigator.of(context).pop();
                        Navigator.of(context).push(MaterialPageRoute(builder: (context) => ClientePesquisa("",0,"",0)));
                      },
                      submenuContent: Text("Cliente")),
                  MLSubmenu(onClick: () {
                        Navigator.of(context).pop();
                        Navigator.of(context).push(MaterialPageRoute(builder: (context) => ProdutoPesquisa(0,"",0,0,"")));
                  }, 
                  submenuContent: Text("Produto")),
                  MLSubmenu(onClick: () {
                        Navigator.of(context).pop();
                        Navigator.of(context).push(MaterialPageRoute(builder: (context) => VendedorPesquisa(0,"",0)));
                  }, 
                  submenuContent: Text("Vendedor")),
                  MLSubmenu(onClick: () {
                        Navigator.of(context).pop();
                        Navigator.of(context).push(MaterialPageRoute(builder: (context) => CondPGTOPesquisa("","","","")));
                  }, 
                  submenuContent: Text("Cond. de Pagamento")),
                  MLSubmenu(onClick: () {
                        Navigator.of(context).pop();
                        Navigator.of(context).push(MaterialPageRoute(builder: (context) => FormaPGTOPesquisa(0,"")));
                  }, 
                  submenuContent: Text("Forma de Pagamento")),
                ],
                onClick: () {}),
            MLMenuItem(
              leading: Icon(Icons.local_grocery_store),
              content: Text("Pré-Venda"),
              onClick: () {
                Navigator.of(context).push(MaterialPageRoute(builder: (context) => PedidoVenda()));
              },
            ),
            MLMenuItem(
              leading: Icon(Icons.settings),
              content: Text("Configuração"),
              onClick: () {
                Navigator.of(context).push(MaterialPageRoute(builder: (context) => Configuracao()));
              }
            )],
          );
  }
}

您正在寻找的是一种叫做状态管理的东西。由于用户已经解释了为什么像 Flutter 这样的框架使管理状态变得困难,您可以在 post.

下阅读他们的评论

有很多状态管理解决方案,但最常用和最常用的两个是:

  1. Provider
  2. BLoC

现在,几乎 99% 的时间都归结为个人偏好以及您最喜欢哪种变体。

如果您想详细了解每个变体,可以在 Medium 上的 BLoc and provider 上阅读一些很棒的指南。