Flutter底部导航BottomNavigationBar:BottomNavigationBar实现页面的切换效果

描述:

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

效果图:

方案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页面.

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小菜鸡的日志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值