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

Posted

技术标签:

【中文标题】Flutter Navigator v2.0 如何弹出子嵌套路由【英文标题】:Flutter Navigator v2.0 how to pop a child nested route 【发布时间】:2021-04-05 08:47:03 【问题描述】:

我一直在尝试flutter new declarative Navigator v2.0,继 johnpryanexample之后,我决定在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 新手,需要了解如何分离和组织我的代码的最佳实践,如何添加更多路由,例如编辑和登录屏幕?使用更多对象,如用户、书籍、作者等...

【问题讨论】:

【参考方案1】:

当 BookDetailsS​​creen 出现时,我有一个调整来显示后退按钮。

    _AppShellState 类中
 @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 和 BookDetailsS​​creen 上都有 appBar,
class BooksListScreen extends StatelessWidget 
  ...
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(), // <- This is the key
      ...
    );
  

希望这是有道理的。

【讨论】:

不错的努力,但这并不能回答问题。

以上是关于Flutter Navigator v2.0 如何弹出子嵌套路由的主要内容,如果未能解决你的问题,请参考以下文章

flutter系列之:在flutter中使用导航Navigator

如何在 Flutter 中的 navigator.pop(context) 之后显示小吃栏?

译学习Flutter中新的Navigator和Router系统

Flutter:如何将 PageRoute Animation 与 Navigator.of(context).pushNamed 结合起来

Flutter Navigator 2.0 页面过渡

Flutter Navigator 弹出和异步多字段数据