当前位置: 首页 > news >正文

Flutter仿Boss-6.底部tab切换

效果

实现

  • 图片资源采用boss包中的动画webp资源。
  • Flutter采用Image加载webp动画。

遇到的问题

问题:Flutter加载webp再次加载无法再次播放动画问题

看如下代码:

Image.asset('assets/images/xxx.webp',width: 40.w,height: 30.w,
)

运行的效果:

直接采用上面代码加载webp动画图片的时候,发现首次加载是没有问题的,当切换其他tab再次切换回来的时候,虽然我重新setState了,但是图片不会重新动画加载出来。开始觉得很奇怪,Image都重新创建了,为啥动画不重新执行呢?心想难道有缓存,想当然就给Image定义了key,每次点击按钮给Image设置不同的key,运行发现还是不行,到这一步只好谷歌大法了,看到了很多人遇到这个问题,但是没有给出解决的答案,看来只能源码大法了。

源码走起~~这里省略…

然后发现Image中有内存缓存ImageCache,翻看了源码后发现了解决方案,因为这里我不需要内存缓存,而且这个缓存与Image中的bundle有关系,只要每次创建Image设置不同的bundle就OK了,所以我就把代码尝试修改了下。

Image.asset('assets/images/xxx.webp',bundle: PlatformAssetBundle(),width: 40.w,height: 30.w,
)

再运行下效果:

完整源码

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_project/res/colors/color_res.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';/// BottomBarItem
class BottomBarItem extends StatefulWidget {// Tab 名字final String tabName;// Tab 图标final String tabIcon;// Tab 选中图标final String tabSelectedIcon;// 默认颜色final Color tabTextColor;// 选中颜色final Color tabTextSelectedColor;// Tab对应索引final int tabIndex;// 点击回调final Function(int) onTap;// 是否选中final bool isChecked;// 角标final int badger;const BottomBarItem({Key? key,required this.tabName,required this.tabIcon,required this.tabSelectedIcon,required this.onTap,required this.tabIndex,this.tabTextColor = Colors.grey,this.tabTextSelectedColor = RC.themeColor,this.isChecked = false,this.badger = 0,}) : super(key: key);@overrideState<BottomBarItem> createState() => _BottomBarItemState();
}class _BottomBarItemState extends State<BottomBarItem> {@overrideWidget build(BuildContext context) {return InkWell(child: Stack(children: [Positioned(child: Container(alignment: Alignment.center,child: Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.start,children: [widget.isChecked? Image.asset(widget.tabSelectedIcon,bundle: PlatformAssetBundle(),width: 40.w,height: 30.w,): Image.asset(widget.tabIcon,width: 40.w,height: 30.w,),Text(widget.tabName,style: TextStyle(color: widget.isChecked? widget.tabTextSelectedColor: widget.tabTextColor,fontSize: 10.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);setState(() {});},);}
}

具体详情:github.com/yixiaolunhui/flutter_project

http://www.lryc.cn/news/337590.html

相关文章:

  • 深入理解机器学习:用Python构建您的第一个预测模型
  • redisson与redis集群检测心跳机制原理
  • 部署Redis
  • 性能测试-数据库优化二(SQL的优化、数据库拆表、分表分区,读写分离、redis)
  • 44.基于SpringBoot + Vue实现的前后端分离-汽车租赁管理系统(项目 + 论文PPT)
  • 2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(五)(含2022年和2023年)
  • Lua语法(四)——协程
  • LangChain-15 Manage Prompt Size 管理上下文大小,用Agent的方式询问问题,并去百科检索内容,总结后返回
  • OR-TOOL 背包算法
  • 前端h5录音
  • Android Studio 使用Flutter开发第一个Web页面(进行中)
  • Vue.js组件精讲 第2章 基础:Vue.js组件的三个API:prop、event、slot
  • npm install 报 ERESOLVE unable to resolve dependency tree 异常解决方法
  • RPC还是HTTP
  • Conda 常用命令总结
  • Spring MVC 文件上传和下载
  • WSL访问adb usb device
  • CDF与PDF(描述随机变量的分布情况)
  • react项目中需要条形码功能,安装react-barcode使用时报错
  • ES6基础(JavaScript基础)
  • [蓝桥杯] 纸张尺寸(C语言)
  • AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.04.05-2024.04.10
  • 【golang】动态生成微信小程序二维码实战下:golang 生成 小程序二维码图片 并通过s3协议上传到对象存储桶 | 腾讯云 cos
  • kubeadm k8s 1.24之后版本安装,带cri-dockerd
  • 13-pyspark的共享变量用法总结
  • BI数据分析软件:行业趋势与功能特点剖析
  • centos7上docker搭建vulhub靶场
  • Flutter入门指南
  • keepalived脑裂问题
  • 【Linux笔记】编mysql库