【问题标题】:Flutter: Build is not called when navigation poppedFlutter:弹出导航时不调用构建
【发布时间】:2020-10-26 08:46:24
【问题描述】:

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

在我的应用程序中,我有一个“订单”,其中包含在我的提供者状态 (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,
          ),
        ), 

用户可以在订单查看屏幕中修改产品数量。例如,如果编辑了一个数量,然后更新了订单(保持在应用程序状态)。

问题

我遇到的问题是,当用户从订单审核中单击返回时,菜单屏幕上的构建功能似乎没有被触发,因此它不会更新(尽管订单中删除了项目,但仍显示旧价格)。

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

【问题讨论】:

  • 实际上,您只是弹出当前视图,底部视图将在其下方活动,快速解决方法是使用 Navigator.push/pushNamed() 而不是 pop,因为它将调用 initState 方法。

标签: flutter dart flutter-provider


【解决方案1】:

一个简单而有效的解决方案是在您使用 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. 按下手机的返回键
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);
        },
      ),
    );
  }
}

【讨论】:

  • 这适用于导航到视图。我的问题是手机上按下了后退按钮,所以我现在没有导航。
  • 对我来说,按下后退按钮会在按下时调用。请尝试我的示例进行确认。
  • 刚刚在我的项目中尝试过,它可以工作!非常感谢。
猜你喜欢
  • 2019-11-08
  • 2023-03-28
  • 2022-06-12
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2013-02-19
  • 2021-03-06
  • 2018-09-23
相关资源
最近更新 更多