1

我一直在尝试更新新的声明式 Navigator v2.0,按照这个 johnpryan 示例,我决定在 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,
      ),

全码

我的问题是,我正在使用_routerDelegate.popRoute()它正在工作,但我不确定这是否是正确的方法?

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

4

1 回答 1

0

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

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

希望这是有道理的。

于 2021-02-28T23:26:38.820 回答