flutter - 如何在 Flutter 中进行嵌套导航

标签 flutter flutter-navigation

有没有人对在 Flutter 中找出嵌套导航有任何建议?

我想要的是即使在重定向到新屏幕时也能保持持久的 BottomNavigationBar。与 YouTube 类似,底栏始终存在,即使您深入浏览菜单也是如此。

我无法从文档中弄清楚。

到目前为止,我能找到的唯一深入到我的要求的教程是 https://medium.com/coding-with-flutter/flutter-case-study-multiple-navigators-with-bottomnavigationbar-90eb6caa6dbf (source code) .然而,这非常令人困惑。

我现在正在使用

Navigator.push(context,
                MaterialPageRoute(builder: (BuildContext context) {
              return Container()

但是,它只是将新的小部件推送到整个堆栈,与 BottomNavigationBar 相吻合。

如有任何提示,我们将不胜感激!

最佳答案

这是一个简单的例子,它甚至支持使用标签栏弹出到第一个屏幕。

import 'package:flutter/material.dart';

import '../library/screen.dart';
import '../playlists/screen.dart';
import '../search/screen.dart';
import '../settings/screen.dart';

class TabsScreen extends StatefulWidget {
  @override
  _TabsScreenState createState() => _TabsScreenState();
}

class _TabsScreenState extends State<TabsScreen> {
  int _currentIndex = 0;

  final _libraryScreen = GlobalKey<NavigatorState>();
  final _playlistScreen = GlobalKey<NavigatorState>();
  final _searchScreen = GlobalKey<NavigatorState>();
  final _settingsScreen = GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: IndexedStack(
        index: _currentIndex,
        children: <Widget>[
          Navigator(
            key: _libraryScreen,
            onGenerateRoute: (route) => MaterialPageRoute(
              settings: route,
              builder: (context) => LibraryScreen(),
            ),
          ),
          Navigator(
            key: _playlistScreen,
            onGenerateRoute: (route) => MaterialPageRoute(
              settings: route,
              builder: (context) => PlaylistsScreen(),
            ),
          ),
          Navigator(
            key: _searchScreen,
            onGenerateRoute: (route) => MaterialPageRoute(
              settings: route,
              builder: (context) => SearchScreen(),
            ),
          ),
          Navigator(
            key: _settingsScreen,
            onGenerateRoute: (route) => MaterialPageRoute(
              settings: route,
              builder: (context) => SettingsScreen(),
            ),
          ),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.fixed,
        currentIndex: _currentIndex,
        onTap: (val) => _onTap(val, context),
        backgroundColor: Theme.of(context).scaffoldBackgroundColor,
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.library_books),
            title: Text('Library'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.list),
            title: Text('Playlists'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.search),
            title: Text('Search'),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.settings),
            title: Text('Settings'),
          ),
        ],
      ),
    );
  }

  void _onTap(int val, BuildContext context) {
    if (_currentIndex == val) {
      switch (val) {
        case 0:
          _libraryScreen.currentState.popUntil((route) => route.isFirst);
          break;
        case 1:
          _playlistScreen.currentState.popUntil((route) => route.isFirst);
          break;
        case 2:
          _searchScreen.currentState.popUntil((route) => route.isFirst);
          break;
        case 3:
          _settingsScreen.currentState.popUntil((route) => route.isFirst);
          break;
        default:
      }
    } else {
      if (mounted) {
        setState(() {
          _currentIndex = val;
        });
      }
    }
  }
}

关于flutter - 如何在 Flutter 中进行嵌套导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55716230/

相关文章:

firebase - 如何为我的 flutter 项目找到兼容的依赖版本? (Firebase_auth、cloud_firestore、intl、flutter_dialogflow_v2)

flutter - 使用 PageRouteBuilder 时,用户手势和后退按钮不起作用

FLUTTER: RangeError (index): Index out of range: no indices are valid: 0 (传递参数)

flutter - 如何在 flutter 过渡期间为旧页面设置动画?

flutter - 如何让你的文字换行?

flutter - 更改 showDatePicker 的日历按钮颜色

Flutter:Hero widget、Navigation 2.0 和 Provider 不能一起正常工作

flutter - 弹多屏时如何返回数据?

Flutter - 如何在不使用 MaterialApp 的情况下处理导航?

Flutter 导航到页面作为根页面