Flutter 学习 之 轮播图(card_swiper)

2022-04-25  本文已影响0人  半城半离人

久负盛名的flutter_swiper pub上在三年前就停止更新了 也没看到支持空安全的版本 今天偶然间浏览发现一个名叫card_swiper的首页介绍和Flutter_swiper一模一样 card_swiper | Flutter Package (flutter-io.cn)

一. 引入插件

dependencies:
  card_swiper: ^2.0.3

二. 简单封装一下

class ComSwiper extends StatelessWidget {
  ///上下文
  final BuildContext context;

  ///轮播图滚动列表
  final List<String> bannerList;

  ///高度可定制
  final double widgetHeight = 160;

  ///返回的item的定制
  final Function item;

  ///是否自动播放
  final bool autoPlay;

  ///点击的回调
  final Function? onTap;

  ///指点杆的布局
  final Alignment paginationAlignment;

  ///指点杆距离组件的距离
  final EdgeInsetsGeometry? paginationMargin;

  ///是否显示指点杆
  final bool showSwiperPagination;

  ///构造指点杆
  final SwiperPlugin? paginationBuilder;

  const ComSwiper(
      {Key? key,
      required this.bannerList,
      this.autoPlay = true,
      required this.item,
      required this.context,
      this.showSwiperPagination = true,
      this.onTap,
      this.paginationAlignment = Alignment.bottomRight,
      this.paginationMargin,
      this.paginationBuilder})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: ScreenHelper.width(widgetHeight),
      child: _swiper(),
    );
  }

  Widget _swiper() {
    return Swiper(
      onTap: (index) => {
        if (onTap != null) {onTap!(bannerList[index])}
      },
      itemCount: bannerList.length,
//如果只有一个不自动播放,多个按需求是否播放
      autoplay: bannerList.length != 1 ? autoPlay : false,
      itemBuilder: (BuildContext context, int index) => item(bannerList[index]),
///如果只有一个不显示指示器或者按需显示指示器
      pagination: (bannerList.length != 1) && showSwiperPagination
          ? SwiperPagination(
              alignment: paginationAlignment,
              margin: paginationMargin ??
                  EdgeInsets.only(
                      right: ScreenHelper.width(20),
                      bottom: ScreenHelper.width(20)),
              builder: paginationBuilder ??
                  RectSwiperPaginationBuilder(
                      color: Theme.of(context).textTheme.caption?.color,
                      activeColor: Theme.of(context).indicatorColor,
                      size: Size(ScreenHelper.width(12), ScreenHelper.width(12)),
                      activeSize: Size(ScreenHelper.width(18), ScreenHelper.width(12))))
          : null,
    );
  }
}

三. 指点杆的种类有些分散不好一眼就看出来 所以我整合了一下

class ComPaginationBuilder {
  ///原点形 指示器
  ///[activeColor]选中的颜色
  ///[color]默认颜色
  ///[size]默认的大小
  ///[activeSize]选中的大小
  ///[space] 间距
  static dot({
    activeColor,
    color,
    size = 10.0,
    activeSize = 10.0,
    space = 3.0,
  }) {
    return DotSwiperPaginationBuilder(
        activeSize: activeSize,
        activeColor: activeColor,
        color: color,
        size: size,
        space: space);
  }

  ///带数字分页的指示器
  ///效果  1/4
  ///  ///[activeColor]选中的颜色
  //   ///[color]默认颜色
  //   ///[fontSize]默认的大小
  //   ///[activeFontSize]选中的大小
  static fraction({
    color,
    fontSize = 20.0,
    activeColor,
    activeFontSize = 35.0,
  }) {
    return FractionPaginationBuilder(
        color: color,
        fontSize: fontSize,
        activeColor: activeColor,
        activeFontSize: activeFontSize);
  }

  ///方块指示器
  ///  ///[activeColor]选中的颜色
  //   ///[color]默认颜色
  //   ///[fontSize]默认的大小
  //   ///[activeFontSize]选中的大小

  static rect({
    activeColor,
    color,
    size = const Size(12.0, 12.0),
    activeSize = const Size(18.0, 12.0),
    space = 3.0
  }) {
    return RectSwiperPaginationBuilder(
        activeSize: activeSize,
        activeColor: activeColor,
        color: color,
        size: size,
        space: space);
  }

  ///圆形的指示器 根据上面那个方块改的
  ///  ///[activeColor]选中的颜色
  //   ///[color]默认颜色
  //   ///[fontSize]默认的大小
  //   ///[activeFontSize]选中的大小

  static circle({
    activeColor,
    color,
    size = const Size(12.0, 12.0),
    activeSize = const Size(18.0, 12.0),
    space = 3.0,
  }) {
    return CirCleSwiperPaginationBuilder(
        activeSize: activeSize,
        activeColor: activeColor,
        color: color,
        size: size,
        space: space);
  }
}

四. 你可以继承SwiperPlugin 创建自己的指示器样式

五. 使用

                   ComSwiper(
                        paginationBuilder: ComPaginationBuilder.circle(),
                        bannerList: [
                          "https://img0.baidu.com/it/u=2862534777,914942650&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500",
                          "https://img0.baidu.com/it/u=2862534777,914942650&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500",
                          "https://img0.baidu.com/it/u=2862534777,914942650&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500",
                          "https://img0.baidu.com/it/u=2862534777,914942650&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500",
                        ],
                        onTap: (index) {
                          debugPrint("我点击了第生死时速$index");
                        },
                        item: (item) => Padding(
                              padding: EdgeInsets.all(ScreenHelper.width(18)),
                              child: ClipRRect(
                                borderRadius: BorderRadius.all(
                                  Radius.circular(ScreenHelper.width(6)),
                                ),
                                child: CaCheImageWidget(imageUrl: item),
                              ),
                            ),
                        context: context),
上一篇下一篇

猜你喜欢

热点阅读