Flutter: как восстановить экран с данными в стеке навигатора

#flutter #dart #navigation-drawer

#флаттер #dart #навигация-ящик

Вопрос:

Я создаю приложение для продаж, в котором я использую ящик для перемещения между экранами с помощью команд навигатора, и обнаружил следующую ситуацию

1 — При открытии приложения оно попадает на главный экран, где производится продажа

2 — Я выбираю два продукта для продажи

3 — сразу после того, как я покину экран продаж с двумя продуктами и перейду к экрану клиентов

4 — теперь мне нужно вернуться к экрану продаж, и два продукта, которые уже были выбраны, все еще должны быть там

Правильно, в этой части 4, используя клавишу для возврата к мобильному телефону, он возвращает экран и переходит к этому экрану продаж (с двумя продуктами там), но если я зайду в ящик и выберу опцию перехода к экрану продаж, как мне выполнить поиск на этом экране вначало стека вместо создания нового экрана продаж (который становится пустым без двух продуктов). Я хочу этого, потому что, если это только один экран поверх стека, никаких проблем, пользователь нажимает, чтобы вернуться назад, и все, но если сверху, например, 5 или 6 экранов, пользователю приходится все возвращать,нажатие несколько раз на обороте, чтобы не потерять то, что уже было сделано на экране продаж. Есть ли какая-либо команда navigator, которая делает это? Я уже искал некоторые вещи, но я не нашел ничего, что помогло бы мне.

Код ящика

  @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()));
              }
            )],
          );
  }
}
 

Комментарии:

1. Вот ваша домашняя работа: flutter.dev/docs/development/data-and-backend/state-mgmt , наслаждайтесь.

2. Flutter, где почти все является виджетом, усложняет управление состоянием. Поскольку сами виджеты в основном эфемерны и не предназначены для сохранения состояния на разных страницах, вам понадобится способ хранения состояния / переменной вне виджетов. Ссылка от Uros — хорошее место для начала, и ознакомьтесь с pub.dev для популярных пакетов управления состоянием.

Ответ №1:

То, что вы ищете, — это то, что называется управлением состоянием. Поскольку пользователь уже объяснил, почему такой фреймворк, как Flutter, затрудняет управление состоянием, вы можете прочитать его комментарий под своим сообщением.

Существует множество решений для управления состоянием, но двумя наиболее распространенными и, как правило, наиболее используемыми являются:

  1. Поставщик услуг
  2. Блок

Теперь почти в 99% случаев все зависит от личных предпочтений и того, какой вариант вам наиболее удобен.

Если вы хотите узнать больше о каждом из вариантов, вы можете прочитать несколько отличных руководств по BLoc и provider на Medium.

Комментарии:

1. большое вам спасибо за внимание, но лучше изучите эту часть, чтобы выполнить мою задачу