Flutter底部导航BottomNavigationBar

742 阅读1分钟

描述:

通过底部导航BottomNavigationBar实现页面的切换效果

效果图:

eygtg-cg9tz.gif

方案1 :

pageView和 _pageCtr.jumpToPage(index)结合,效果只初始当前页面的索引页,其他页面需要触发之后才会渲染

方案2 :

IndexedStack ,效果初始化所有页面

代码:




class TabNav extends StatefulWidget {
  const TabNav({Key? key}) : super(key: key);

  @override
  State<TabNav> createState() => _TabNavState();
}

class _TabNavState extends State<TabNav> {
  // 当前页面索引
  int _curIndex = 0;
  // body界面
  final List<Widget> _pages = const [
    HomePage(),
    NewsPage(),
    PractticePage(),
    ProfilePage()
  ];

  // 页面控制器
  final PageController _pageCtr = PageController();
  @override
  void dispose() {
    _pageCtr.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 方案1:pageView,只初始当前页面的索引页
      // body: PageView(
      //   physics: const NeverScrollableScrollPhysics(),
      //   controller: _pageCtr,
      //   children: _pages,
      // ),

      //方案2:IndexedStack,初始化所有页面
      body: IndexedStack(
        children: _pages,
        index: _curIndex,
      ),
      bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.fixed,
        selectedFontSize: 11,
        unselectedFontSize: 11,
        selectedItemColor: Colors.teal,
        unselectedItemColor: Colors.grey,
        items: const [
          BottomNavigationBarItem(
            icon: Icon(Icons.home_filled, color: Colors.grey),
            activeIcon: Icon(Icons.home_filled, color: Colors.teal),
            label: "首页",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.messenger_sharp, color: Colors.grey),
            activeIcon: Icon(Icons.messenger_sharp, color: Colors.teal),
            label: "消息",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.menu_book_rounded, color: Colors.grey),
            activeIcon: Icon(Icons.menu_book_rounded, color: Colors.teal),
            label: "案例",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.person_pin_circle_sharp, color: Colors.grey),
            activeIcon: Icon(Icons.person_pin_circle_sharp, color: Colors.teal),
            label: "我的",
          ),
        ],
        currentIndex: _curIndex,
        onTap: (int index) {
          // 结合方案1使用
          // setState(() {
          //   _pageCtr.jumpToPage(index);
          //   _curIndex = index;
          // });

          // 结合方案2使用
          setState(() {
            _curIndex = index;
          });
        },
      ),
    );
  }
}
    


束语:

当我们在_pages数组中的页面初始化出添加输出打印,通过底部导航切换,方案一点击时会看到当前跳转的页面初始化,方案二则会在首次加载的时候初始化所有的_pages页面.