Flutter Navigator v2.0 如何弹出子嵌套路由

Flutter Navigator v2.0 how to pop a child nested route

我一直在尝试 flutter new declarative Navigator v2.0,在此之后 johnpryan example,我决定更改 BookDetailsS​​creen 中的 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,
      ),

Fullcode

我的问题是,我正在使用 _routerDelegate.popRoute() 它可以正常工作,但我不确定这样做是否正确?

PS:如果有人有一个使用 Navigator v2.0 的更复杂的示例,我是 Flutter 的新手,需要了解如何分离和组织我的代码的最佳实践,如何为例如编辑和登录屏幕?处理更多对象,如用户、书籍、作者等...

我有一个调整,可以在显示 BookDetailsS​​creen 时自然地显示后退按钮。

  1. _AppShellStateclass
 @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
      
    );
  }
  1. build 方法中将 appBar 属性 添加到 Screens Scaffold 中,如下所示。在 BooksListScreen 和 BookDetailsS​​creen 上都有 appBar,
class BooksListScreen extends StatelessWidget {
  ...
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(), // <- This is the key
      ...
    );
  }
}

希望这是有道理的。