Flutter中BottomNavigationBar+IndexedStack实现底部导航栏

Flutter底部导航栏切换页面的实现,

主要步骤如下:

  1. 引入相关包和页面文件。

  2. 定义TabPage StatefulWidget和其状态管理类_TabPageState。

  3. 在_TabPageState中定义当前选中的底部导航栏索引变量currentIndex。

  4. 在build方法中构建页面UI,使用Scaffold作为根组件。

  5. 使用SafeArea确保内容不会超出屏幕安全区域。

  6. 使用IndexedStack保持页面状态,避免页面重建。

  7. 定义底部导航栏,并设置主题去除水波纹和点击高亮效果。

  8. 设置底部导航栏的选中标签和未选中标签样式。

  9. 定义底部导航栏项目列表。

tab_page.dart

 


import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; // 引入屏幕适配库
import 'package:wan_android_flutter/pages/home/home_page.dart'; // 引入首页页面
import 'package:wan_android_flutter/pages/hot_key/hot_key_page.dart'; // 引入热点页面
import 'package:wan_android_flutter/pages/knowledge/knowledge_page.dart'; // 引入体系页面
import 'package:wan_android_flutter/pages/personal/personal_page.dart'; // 引入个人中心页面

// 定义TabPage StatefulWidget,用于底部导航栏切换页面
class TabPage extends StatefulWidget {
  const TabPage({super.key});

  @override
  State createState() {
    return _TabPageState();
  }
}

// _TabPageState类,用于管理TabPage的状态
class _TabPageState extends State<TabPage> {
  int currentIndex = 0; // 当前选中的底部导航栏索引

  @override
  Widget build(BuildContext context) {
    // 构建页面UI
    return Scaffold(
      body: SafeArea(
        // SafeArea确保内容不会超出屏幕安全区域
        child: IndexedStack(
          // IndexedStack用于保持页面状态,避免页面重建
          index: currentIndex,
          children: [
            HomePage(), // 首页
            HotKeyPage(), // 热点
            KnowledgePage(), // 体系
            PersonalPage(), // 我的
          ],
        ),
      ),
      bottomNavigationBar: Theme(
          // 修改底部导航栏主题
          data: Theme.of(context).copyWith(
              splashColor: Colors.transparent, // 去除水波纹效果
              highlightColor: Colors.transparent), // 去除点击高亮效果
          child: BottomNavigationBar(
            type: BottomNavigationBarType.fixed,
            // 固定底部导航栏
            selectedLabelStyle: TextStyle(fontSize: 14.sp, color: Colors.black),
            // 选中标签样式
            unselectedLabelStyle:
                TextStyle(fontSize: 12.sp, color: Colors.blueGrey),
            // 未选中标签样式
            currentIndex: currentIndex,
            // 当前选中的索引
            items: _barItemList(),
            // 底部导航栏项目列表
            onTap: (index) {
              // 点击切换页面
              currentIndex = index;
              setState(() {}); // 更新页面
            },
          )),
    );
  }

  // 构建底部导航栏项目列表
  List<BottomNavigationBarItem> _barItemList() {
    List<BottomNavigationBarItem> items = []; // 初始化项目列表
    // 添加首页项目
    items.add(BottomNavigationBarItem(
        label: "置顶",
        activeIcon: Image.asset("assets/images/icon_home_selected.png",
            width: 32.r, height: 32.r), // 选中状态的图标
        icon: Image.asset("assets/images/icon_home_grey.png",
            width: 32.r, height: 32.r))); // 未选中状态的图标
    // 添加热点项目
    items.add(BottomNavigationBarItem(
        label: "热点",
        activeIcon: Image.asset("assets/images/icon_hot_key_selected.png",
            width: 32.r, height: 32.r),
        icon: Image.asset("assets/images/icon_hot_key_grey.png",
            width: 32.r, height: 32.r)));
    // 添加体系项目
    items.add(BottomNavigationBarItem(
        label: "体系",
        activeIcon: Image.asset("assets/images/icon_knowledge_selected.png",
            width: 32.r, height: 32.r),
        icon: Image.asset("assets/images/icon_knowledge_grey.png",
            width: 32.r, height: 32.r)));
    // 添加我的项目
    items.add(BottomNavigationBarItem(
        label: "我的",
        activeIcon: Image.asset("assets/images/icon_personal_selected.png",
            width: 32.r, height: 32.r),
        icon: Image.asset("assets/images/icon_personal_grey.png",
            width: 32.r, height: 32.r)));
    return items; // 返回项目列表
  }
}

hot_key_page.dart

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class HotKeyPage extends StatefulWidget {
  @override
  State createState() {
    return _HotKeyPageState();
  }
}

class _HotKeyPageState extends State<HotKeyPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Text("hotKey"),
        ),
      ),
    );
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值