IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter开发之——底部导航栏BottomNavigationBar -> 正文阅读

[移动开发]Flutter开发之——底部导航栏BottomNavigationBar

一 底部导航栏效果图

模式首页关系图导航页关于我
Fixed
Shifting

二 BottomNavigationBar详解

2.1 BottomNavigationBar介绍

  • BottomNavigationBar是Scaffold脚手架中的位于底部的一个组件
  • BottomNavigationBar位于body的下方,属于底部导航栏
  • BottomNavigationBar包含多个BottomNavigationBarItem,BottomNavigationBarItem用于设置显示图标和文字
  • 点击BottomNavigationBarItem,切换到BottomNavigationBarItem对应的页面

2.2 BottomNavigationBar和BottomNavigationBarItem

BottomNavigationBar

  BottomNavigationBar({
    Key? key,
    required this.items,
    this.onTap,
    this.type,
    this.currentIndex = 0,
    Color? fixedColor,
    this.backgroundColor,
    this.iconSize = 24.0,
    Color? selectedItemColor,
    this.unselectedItemColor,
    this.selectedFontSize = 14.0,
    this.unselectedFontSize = 12.0,
  })
编号属性类型说明
1itemsList<BottomNavigationBarItem> items导航栏显示BarItem
2onTapValueChanged<int>?BarItem点击事件
3typeBottomNavigationBarType?导航栏类型,有fixed和shifting两个类型
4currentIndexint当前选中的BarItem
5fixedColorColor?BarItem选中时颜色,和selectedItemColor不可同时存在
6backgroundColorColor?整个底部导航栏的背景色
7iconSizedouble大小为24.0
8selectedItemColorColor?BarItem选中时颜色,和fixedColor不可同时存在
9unselectedItemColorColor?BarItem未选中时颜色
10selectedFontSizedoubleBarItem选中时文字大小
11unselectedFontSizedoubleBarItem未选中时文字大小

BottomNavigationBarItem

const BottomNavigationBarItem({
    required this.icon,
    this.label,
    Widget? activeIcon,
    this.backgroundColor,
    this.tooltip,
  })
编号属性类型说明
1iconWidgetBarItem图标,一般是Icon
2labelString?BarItem下方显示文字,用于渲染Text时的字符串
3activeIconWidget?BarItem选中时显示图标,一般是Icon(颜色一样不一样)
4backgroundColorColor?BottomNavigationBarType为shifting时的背景颜色

三 页面切换相关知识点

3.1 PageView

什么是PageView

  • PageView类似于Android中的Viewpager,可以做垂直或水平滑动
  • 通过children,创建一个可滚动视图列表
  • 构造PageView时,需要传入一个PageController(页面控制器)
  • 页面切换时调用onPageChanged方法,切换页面显示

PageView构造方法

PageView({
    Key? key,
    this.scrollDirection = Axis.horizontal,
    this.reverse = false,
    PageController? controller,
    this.physics,
    this.pageSnapping = true,
    this.onPageChanged,
    List<Widget> children = const <Widget>[],
  })
编号属性类型说明
1scrollDirectionAxis滚动方向,有horizontal和vertical两个方向
2reversebool滚动方向反转
3controllerPageController?页面控制器
4physicsScrollPhysics?滚动的方式,如:阻尼效果、水波纹效果
5pageSnappingbool是否具有回弹效果,默认为 true
6onPageChangedValueChanged<int>?页面切换时调用
7childrenList<Widget>子控件视图集

3.2 PageController-属性和方法说明

编号属性(方法)类型说明
1initialPageint首次创建PageView时显示第几个页面
2keepPagebool是否保存当前页面
3viewportFractiondouble页面在PageView视图中占比,默认1.0,全部填充满
4jumpToPageFunc改变PageView中显示页面

四 示例项目

4.1 项目结构

4.2 项目代码

main

void main()=>runApp(GetMaterialApp(
    getPages: [
      GetPage(name: '/', page: ()=>IndexWidget(),binding: IndexBinding())
    ]
));

IndexWidget

class IndexWidget extends StatelessWidget{
  IndexController controller=Get.find<IndexController>();
  @override
  Widget build(BuildContext context) {
   return Scaffold(
     appBar: AppBar(title: Text('BottomNavigationBar'),),
     bottomNavigationBar: _buildBottomNavigationBar(),
     body: _buildPageView(),
   );
  }

  Widget _buildBottomNavigationBar(){
    return Obx(()=>BottomNavigationBar(
        items: controller.bottomTabs,
        currentIndex: controller.currentPage,
        type: BottomNavigationBarType.fixed,
        // fixedColor: Colors.red,
        selectedFontSize: 16,
        unselectedFontSize: 13,
        onTap:  (int index) => controller.switchBottomTabBar(index),
       ));
  }
  /// 内容页
  Widget _buildPageView() {
    return PageView(
      //禁止滑动
      //physics: const NeverScrollableScrollPhysics(),
      children: controller.tabPageBodies,
      controller: controller.pageController,
      onPageChanged: (index) => controller.onPageChanged(index),
    );
  }
}

IndexBinding

class IndexBinding implements Bindings{
  @override
  void dependencies() {
    Get.lazyPut(() => IndexController());
  }
}

IndexController

class IndexController extends GetxController{
  /// 响应式成员变量,默认位置指引0
  final _currentPage = 0.obs;
  set currentPage(index) => _currentPage.value = index;
  get currentPage => _currentPage.value;


  /// PageView页面控制器
  late PageController pageController;
  //Page页面集合
  late List<Widget> tabPageBodies;
  /// 底部BottomNavigationBarItem
  late List<BottomNavigationBarItem> bottomTabs;


  switchBottomTabBar(int index) {
   //点击底部BottomNavigationBarItem切换PageView页面
    //pageController.animateToPage(index,duration: Duration(seconds: 1),curve: Curves.fastLinearToSlowEaseIn);
    pageController.jumpToPage(index);
  }

  onPageChanged(int index) {
    currentPage = index;
  }
  /// 在Widget内存中分配后立即调用,可以用它来初始化initialize一些东西
  @override
  void onInit() {
    super.onInit();
    pageController = PageController(initialPage: currentPage);
    bottomTabs=const <BottomNavigationBarItem>[
      BottomNavigationBarItem(backgroundColor: Colors.orange,icon: Icon(Icons.home_outlined,size: 20,),activeIcon:Icon(Icons.home,size: 25) ,label: 'home'),
      BottomNavigationBarItem(backgroundColor: Colors.green,icon: Icon(Icons.account_tree_outlined,size: 20,),activeIcon:Icon(Icons.account_tree,size: 25) ,label: 'Tree'),
      BottomNavigationBarItem(backgroundColor: Colors.red,icon: Icon(Icons.navigation_outlined,size: 20,),activeIcon:Icon(Icons.navigation,size: 25) ,label: 'Navigator'),
      BottomNavigationBarItem(backgroundColor: Colors.deepOrange,icon: Icon(Icons.person_outline,size: 20,),activeIcon:Icon(Icons.person,size: 25) ,label: 'Me'),
    ];

    tabPageBodies = <Widget>[
      HomeWidget(),
      TreeWidget(),
      NavigatorWidget(),
      MeWidget()
    ];
  }

}

HomeWidget

class HomeWidget extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Home'));
  }

}

TreeWidget

class TreeWidget extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
   return Center(child: Text('Tree'));
  }

}

NavigatorWidget

class NavigatorWidget extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Navigator'));
  }

}

MeWidget

class MeWidget extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Center(child: Text('Me'));
  }
}

五 参考

CSDN-参考代码

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:15:26  更:2022-05-08 08:15:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 0:48:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码