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
方法在三种情况下被调用:
- 您调用 Navigator.pop(当您单击 FAB 时会发生这种情况)
appBar
中的后退按钮(隐式调用 Navigator.pop tbh)
- 按下 phone
的后退按钮
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);
},
),
);
}
}
我使用提供程序库已经有一段时间了,试图掌握它。 我最近 运行 遇到了导航问题。
在我的应用程序中,我有一个“订单”,其中包含在我的提供商状态 (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
方法在三种情况下被调用:
- 您调用 Navigator.pop(当您单击 FAB 时会发生这种情况)
appBar
中的后退按钮(隐式调用 Navigator.pop tbh)- 按下 phone 的后退按钮
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);
},
),
);
}
}