Flutter仿Boss-6.底部tab切换

简介: 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);

  @override
  State<BottomBarItem> createState() => _BottomBarItemState();
}

class _BottomBarItemState extends State<BottomBarItem> {
  @override
  Widget 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

相关文章
|
4月前
Flutter仿Boss-5.Lottie实现的Tab切换
本文介绍了如何在Flutter项目中使用Lottie库创建自定义动画的Tab栏项(LottieBottomBarItem),并展示了如何集成到带有PageView的主页底部导航栏中,以及相关的状态管理和逻辑控制。
40 0
|
4月前
Flutter-底部弹出框(Widget层级)
文章描述了如何在Flutter中使用DraggableScrollableSheet创建一个底部弹出框,同时保持其可手势滑动关闭。作者遇到问题并提出对原控件进行扩展,以支持头部和列表布局的滑动关闭功能。
186 0
|
Android开发 UED
Flutter控件之Tab选项卡封装
Tab选项卡,这是一个非常常见且权重很高的一个组件,随便打开一个App,比如掘金,如下图,首页顶部就是一个Tab选项卡,这个功能可以说,几乎每个App都会存在。
232 0
|
存储 前端开发
Flutter 实现多选底部弹窗
本篇介绍了底部弹窗实现多选的方式,其中实现的方式还可以有很多种,例如直接在自定义组件中使用有状态组件。这里介绍的方法可以作为一个参考,通过动态构建有状态组件能够简单快速地实现底部弹窗的多选功能。
692 0
Flutter 实现多选底部弹窗
|
容器
Flutter 底部弹窗ModelBottomSheet详解
本篇介绍了三种 ModalBottomSheet 的方式,实际开发过程中,还可以根据需要,利用 ModalBottomSheet的 builder 方法构建自定义的底部弹窗,满足业务需要。
1224 0
Flutter 底部弹窗ModelBottomSheet详解
|
Dart 开发者
【Flutter】顶部导航栏实现 ( Scaffold | DefaultTabController | TabBar | Tab | TabBarView )(二)
【Flutter】顶部导航栏实现 ( Scaffold | DefaultTabController | TabBar | Tab | TabBarView )(二)
427 0
【Flutter】顶部导航栏实现 ( Scaffold | DefaultTabController | TabBar | Tab | TabBarView )(二)
Flutter swiper在tab切换之后快速循环
Flutter swiper在tab切换之后快速循环
259 0
flutter实现底部弹出框以及特色功能
今天项目中要实现底部弹出框并且实现圆角功能,先来预览一下 可以看出实现的公告有 底部圆角,以及朋友圈,微信转发等 实现逻辑我直接代码列出
586 0
flutter实现底部弹出框以及特色功能
|
数据可视化 API 索引
【Flutter】顶部导航栏实现 ( Scaffold | DefaultTabController | TabBar | Tab | TabBarView )(一)
【Flutter】顶部导航栏实现 ( Scaffold | DefaultTabController | TabBar | Tab | TabBarView )(一)
483 0
Flutter ListView解决底部或顶部留白问题
Flutter ListView解决底部或顶部留白问题 在没有设置padding的情况下,上下都有留白 方法一:
492 0