Flutter Navigator v2.0 如何弹出子嵌套路由
Flutter Navigator v2.0 how to pop a child nested route
我一直在尝试 flutter new declarative Navigator v2.0,在此之后
johnpryan example,我决定更改 BookDetailsScreen 中的 FlatButton pop():
class BookDetailsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
children: [
FlatButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('Back'),
),
],
}
到_AppShellState中的父路由器AppBar():
class _AppShellState extends State<AppShell> {
InnerRouterDelegate _routerDelegate;
ChildBackButtonDispatcher _backButtonDispatcher;
@override
Widget build(BuildContext context) {
var appState = widget.appState;
_backButtonDispatcher.takePriority();
return Scaffold(
appBar: appState.selectedBook != null
? AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () => _routerDelegate.popRoute(),
),
actions: [
IconButton(
icon: Icon(Icons.more_vert),
onPressed: () => null,
)
],
)
: AppBar(),
body: Router(
routerDelegate: _routerDelegate,
backButtonDispatcher: _backButtonDispatcher,
),
我的问题是,我正在使用 _routerDelegate.popRoute() 它可以正常工作,但我不确定这样做是否正确?
PS:如果有人有一个使用 Navigator v2.0 的更复杂的示例,我是 Flutter 的新手,需要了解如何分离和组织我的代码的最佳实践,如何为例如编辑和登录屏幕?处理更多对象,如用户、书籍、作者等...
我有一个调整,可以在显示 BookDetailsScreen 时自然地显示后退按钮。
- 在
_AppShellState
class
@override
Widget build(BuildContext context) {
...
return Scaffold(
// <- Comment out this appBar
// appBar: AppBar(
// leading: appState.selectedBook != null
// ? IconButton(
// icon: Icon(Icons.arrow_back),
// onPressed: () => _routerDelegate.popRoute(),
// )
// : null,
// ),
...
// Keep the rest part the same
);
}
- 在
build
方法中将 appBar
属性 添加到 Screens Scaffold 中,如下所示。在 BooksListScreen 和 BookDetailsScreen 上都有 appBar,
class BooksListScreen extends StatelessWidget {
...
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(), // <- This is the key
...
);
}
}
希望这是有道理的。
我一直在尝试 flutter new declarative Navigator v2.0,在此之后 johnpryan example,我决定更改 BookDetailsScreen 中的 FlatButton pop():
class BookDetailsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
children: [
FlatButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('Back'),
),
],
}
到_AppShellState中的父路由器AppBar():
class _AppShellState extends State<AppShell> {
InnerRouterDelegate _routerDelegate;
ChildBackButtonDispatcher _backButtonDispatcher;
@override
Widget build(BuildContext context) {
var appState = widget.appState;
_backButtonDispatcher.takePriority();
return Scaffold(
appBar: appState.selectedBook != null
? AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () => _routerDelegate.popRoute(),
),
actions: [
IconButton(
icon: Icon(Icons.more_vert),
onPressed: () => null,
)
],
)
: AppBar(),
body: Router(
routerDelegate: _routerDelegate,
backButtonDispatcher: _backButtonDispatcher,
),
我的问题是,我正在使用 _routerDelegate.popRoute() 它可以正常工作,但我不确定这样做是否正确?
PS:如果有人有一个使用 Navigator v2.0 的更复杂的示例,我是 Flutter 的新手,需要了解如何分离和组织我的代码的最佳实践,如何为例如编辑和登录屏幕?处理更多对象,如用户、书籍、作者等...
我有一个调整,可以在显示 BookDetailsScreen 时自然地显示后退按钮。
- 在
_AppShellState
class
@override
Widget build(BuildContext context) {
...
return Scaffold(
// <- Comment out this appBar
// appBar: AppBar(
// leading: appState.selectedBook != null
// ? IconButton(
// icon: Icon(Icons.arrow_back),
// onPressed: () => _routerDelegate.popRoute(),
// )
// : null,
// ),
...
// Keep the rest part the same
);
}
- 在
build
方法中将appBar
属性 添加到 Screens Scaffold 中,如下所示。在 BooksListScreen 和 BookDetailsScreen 上都有 appBar,
class BooksListScreen extends StatelessWidget {
...
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(), // <- This is the key
...
);
}
}
希望这是有道理的。