Flutter:弹出导航时不会调用构建

Flutter: Build is not called when navigation popped

我使用提供程序库已经有一段时间了,试图掌握它。 我最近 运行 遇到了导航问题。

在我的应用程序中,我有一个“订单”,其中包含在我的提供商状态 (appState) 中持有的产品。订单在菜单视图中建立。然后我使用以下代码转到“产品评论”屏幕:

 Navigator.push(
        context,
        PageRouteBuilder(
          transitionDuration: transitionDuration == null
              ? Duration(
                  milliseconds: appState.settings
                      .standardPageNavigatoinDuration) // standard app durration
              : transitionDuration,
          pageBuilder: (_, __, ___) => Provider<TrinoAppState>.value(
            child: view,
            value: appState,
          ),
        ), 

用户可以在订单审核界面修改产品数量。例如,如果编辑了一个数量,然后更新了订单(保留在应用程序状态)。

问题

我遇到的问题是,当用户从订单查看中点击返回时,菜单屏幕上的构建功能似乎没有被触发,因此它没有更新(尽管订单中的商品已删除,但仍显示旧价格).

我不确定解决这个问题的最佳方法是什么,您有什么建议吗?

一个简单而有效的解决方案是在使用 pop 时调用 setState(我假设这是返回首页的操作)。

这看起来像这样:

  Navigator.push(
    context,
    PageRouteBuilder(
      transitionDuration: transitionDuration == null
          ? Duration(
              milliseconds:
                  appState.settings.standardPageNavigatoinDuration) // standard app durration
          : transitionDuration,
      pageBuilder: (_, __, ___) => Provider<TrinoAppState>.value(
        child: view,
        value: appState,
      ),
    ),
  ).whenComplete(() => setState((){})),

这是一个小的工作示例。 whenComplete方法在三种情况下被调用:

  1. 您调用 Navigator.pop(当您单击 FAB 时会发生这种情况)
  2. appBar 中的后退按钮(隐式调用 Navigator.pop tbh)
  3. 按下 phone
  4. 的后退按钮
import 'dart:math';

import 'package:flutter/material.dart';

main() {
  runApp(MaterialApp(home: MyApp()));
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First page'),
      ),
      floatingActionButton: FloatingActionButton(
        backgroundColor: Colors.red,
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => SecondRoute()),
          ).whenComplete(() => print('POP'));
        },
      ),
    );
  }
}

class SecondRoute extends StatefulWidget {
  @override
  _SecondRouteState createState() => _SecondRouteState();
}

class _SecondRouteState extends State<SecondRoute> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second page'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.pop(context);
        },
      ),
    );
  }
}