带有命名路线的持续导航栏颤抖?

Jan*_*ala 9 dart flutter

我一直在寻找Flutter的一个很好的导航/路由器示例,但是我没有找到一个例子。

我想要实现的非常简单:

  1. 持久的底部导航栏,突出显示当前的顶层路线
  2. 命名路线,以便我可以从应用程序内的任何位置导航到任何路线
  3. Navigator.pop应该始终将我带入之前的视图

BottomNavigationBar的官方Flutter演示达到1,但后退按钮和路由无效。PageView和TabView的相同问题。还有许多其他教程通过实现MaterialApp路线来实现2和3,但是它们似乎都没有持久的导航栏。

有没有可以满足所有这些要求的导航系统示例?

CZX*_*CZX 42

您的所有 3 个要求都可以通过使用自定义Navigator来实现。

Flutter 团队为此做了一个视频,他们关注的文章在这里:https : //medium.com/flutter/getting-to-the-bottom-of-navigation-in-flutter-b3e440b9386

基本上,您需要将 Scaffold 的主体包装在自定义中Navigator

class _MainScreenState extends State<MainScreen> {
  final _navigatorKey = GlobalKey<NavigatorState>();

  // ...

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Navigator(
        key: _navigatorKey,
        initialRoute: '/',
        onGenerateRoute: (RouteSettings settings) {
          WidgetBuilder builder;
          // Manage your route names here
          switch (settings.name) {
            case '/':
              builder = (BuildContext context) => HomePage();
              break;
            case '/page1':
              builder = (BuildContext context) => Page1();
              break;
            case '/page2':
              builder = (BuildContext context) => Page2();
              break;
            default:
              throw Exception('Invalid route: ${settings.name}');
          }
          // You can also return a PageRouteBuilder and
          // define custom transitions between pages
          return MaterialPageRoute(
            builder: builder,
            settings: settings,
          );
        },
      ),
      bottomNavigationBar: _yourBottomNavigationBar,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

在底部导航栏中,要导航到新 custom 中的新屏幕Navigator,您只需调用:

_navigatorKey.currentState.pushNamed('/yourRouteName');
Run Code Online (Sandbox Code Playgroud)

为了实现第三个要求,这是Navigator.pop带你到一个视图,你将需要包装定制NavigatorWillPopScope

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: WillPopScope(
      onWillPop: () async {
        if (_navigatorKey.currentState.canPop()) {
          _navigatorKey.currentState.pop();
          return false;
        }
        return true;
      },
      child: Navigator(
        // ...
      ),
    ),
    bottomNavigationBar: _yourBottomNavigationBar,
  );
}
Run Code Online (Sandbox Code Playgroud)

应该就是这样!无需手动处理弹出或管理自定义历史列表。

  • @AbdullahKhan 你不应该需要。只需将状态与 UI 分开即可。一些有用的库选项:Redux、BLoC、MobX。 (2认同)
  • @czx 如何隐藏子路由中的底部导航栏? (2认同)

Kya*_*Tun 6

CupertinoTabBar 的行为与您描述的完全相同,但采用 iOS 风格。然而它可以用于MaterialApps

示例代码