Flutter仿Boss-5.Lottie实现的Tab切换

2024-04-05 23:12

本文主要是介绍Flutter仿Boss-5.Lottie实现的Tab切换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果

Lottie引入

根据自己项目适配的Flutter版本引入对应的Lottie版本。

lottie: ^3.1.0

实现

  • lottie 文件,直接下载Boss APK,解压出来就可以拿到。
  • 代码:

LottieBottomBarItem

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:lottie/lottie.dart';/// Lottie BottomBarItem
class LottieBottomBarItem extends StatefulWidget {// Tab 名字final String tabName;// Tab 图标final String tabIcon;// 默认颜色final Color tabTextColor;// 选中颜色final Color tabTextSelectedColor;// Tab对应索引final int tabIndex;// 点击回调final Function(int) onTap;// 是否选中final bool isChecked;// 角标final int badger;const LottieBottomBarItem({Key? key,required this.tabName,required this.tabIcon,required this.onTap,required this.tabIndex,this.tabTextColor = Colors.grey,this.tabTextSelectedColor = Colors.black,this.isChecked = false,this.badger = 0,}) : super(key: key);@overrideState<LottieBottomBarItem> createState() => _BottomBarItemState();
}class _BottomBarItemState extends State<LottieBottomBarItem>with TickerProviderStateMixin {AnimationController? _animationController;@overridevoid initState() {super.initState();_animationController = AnimationController(vsync: this, duration: const Duration(milliseconds: 500));if (widget.isChecked) {_animationController?.forward();}}@overridevoid didUpdateWidget(covariant LottieBottomBarItem oldWidget) {super.didUpdateWidget(oldWidget);if (!widget.isChecked && oldWidget != widget) {_animationController?.reset();}}@overridevoid dispose() {_animationController?.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return InkWell(child: Stack(alignment: Alignment.bottomCenter,children: [Positioned(child: Column(children: [Lottie.asset(widget.tabIcon,repeat: false,controller: _animationController,width: 35.w,height: 30.w,),Text(widget.tabName,style: TextStyle(color: widget.isChecked? widget.tabTextSelectedColor: widget.tabTextColor,fontSize: 12.sp,),)],),),Visibility(visible: widget.badger > 0,child: Positioned(right: 30.w,top: 10.w,child: ClipOval(child: Container(alignment: Alignment.center,color: Colors.red,width: 8,height: 8,),),),)],),onTap: () {widget.onTap(widget.tabIndex);_animationController?.forward();},);}
}

HomePage


class HomePage extends StatefulWidget with RouteQueryMixin {HomePage({Key? key}) : super(key: key);@overrideState<StatefulWidget> createState() {return HomeState();}
}class HomeState extends PageState<HomePage> with AutomaticKeepAliveClientMixin {final logic = Get.put(HomeLogic());@overridevoid initState() {super.initState();logic.handleCurrentIndex(params: widget.routeParams);}@overrideWidget build(BuildContext context) {return Scaffold(body: _homeBodyWidget(context),);}Widget _homeBodyWidget(BuildContext context) {return Scaffold(body: Stack(alignment: Alignment.bottomCenter,children: <Widget>[// 子布局PageView(controller: logic.pageController,physics: const NeverScrollableScrollPhysics(),children: _bodyContentWidget(),onPageChanged: (index) {logic.state.currentIndex.value = index;},),],),// 底部栏bottomNavigationBar: Obx(() => BottomAppBar(elevation: 5.0,height: 65,child: Row(mainAxisAlignment: MainAxisAlignment.spaceAround,crossAxisAlignment: CrossAxisAlignment.center,children: List.generate(logic.state.homeBottomBar.length,(index) => Expanded(child: LottieBottomBarItem(tabName: logic.state.homeBottomBar[index].tabName,tabIcon: logic.state.homeBottomBar[index].tabIcon,tabIndex: index,onTap: (index) {logic.state.currentIndex.value = index;logic.pageController.jumpToPage(index);},isChecked: logic.state.currentIndex.value == index,),),)),),),);}@overridebool get wantKeepAlive => true;/// 子布局集合List<Widget> _bodyContentWidget() {return logic.state.homeBottomBar.map((item) => item.child).toList();}
}

HomeState

class HomeTab {HomeTab({required this.tabName,required this.tabIcon,required this.child,this.badger = 0,});String tabName;String tabIcon;Widget child;int badger;
}class HomeState {///当前索引RxInt currentIndex = 0.obs;///底部按钮final List<HomeTab> homeBottomBar = [HomeTab(tabName: '职位',tabIcon: 'assets/lottie/tab/zhiwei.json',child: const WorkPage()),HomeTab(tabName: '有了',tabIcon: 'assets/lottie/tab/youle.json',child: const YoulePage()),HomeTab(tabName: '消息',tabIcon: 'assets/lottie/tab/xiaoxi-c.json',child: const MessagePage()),HomeTab(tabName: '我的',tabIcon: 'assets/lottie/tab/wode-c.json',child: const MinePage()),];
}

HomeLogic

class HomeLogic extends GetxController with HttpApi {final HomeState state = HomeState();late PageController pageController;/// 处理tab默认显示索引void handleCurrentIndex({required Map<String, dynamic> params}) {int size = state.homeBottomBar.length;if (params != null) {int tabIndex = params["tabIndex"] ?? 0;// 默认加载页面if (tabIndex >= size) {state.currentIndex.value = size - 1;} else {state.currentIndex.value = tabIndex;}}// 初始化tab控制器pageController = PageController(initialPage: state.currentIndex.value, keepPage: true);}
}

详情:github.com/yixiaolunhui/flutter_project

这篇关于Flutter仿Boss-5.Lottie实现的Tab切换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878402

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand