Flutter轮播组件插件en_card_swiper的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter轮播组件插件en_card_swiper的使用

概述

en_card_swiper 是一个用于 Flutter 的轮播组件插件,支持多种布局、无限循环功能,并且兼容 Android 和 iOS。它提供了丰富的配置选项,包括分页器、控制按钮、自动播放等。


安装

pubspec.yaml 文件中添加以下依赖:

en_card_swiper: ^0.0.1

然后运行以下命令安装依赖:

flutter packages get

或者使用以下命令:

flutter pub add en_card_swiper

基本用法

创建新项目

使用以下命令创建一个新的 Flutter 项目:

flutter create myapp

编辑 lib/main.dart 文件如下:

import 'package:flutter/material.dart';
import 'package:en_card_swiper/en_card_swiper.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ENSwiper(
        itemBuilder: (BuildContext context, int index) {
          return Image.network(
            "https://via.placeholder.com/350x150",
            fit: BoxFit.fill,
          );
        },
        itemCount: 3,
        pagination: ENSwiperPagination(),
        control: ENSwiperController(),
      ),
    );
  }
}

运行后,你将看到一个简单的轮播组件,包含 3 张图片。


构造函数详解

基础参数

参数名称 默认值 描述
scrollDirection Axis.horizontal 如果设置为 Axis.horizontal,子元素会水平排列;否则垂直排列。
axisDirection AxisDirection.left 控制滚动方向,仅支持水平堆叠布局。
loop true 是否启用连续循环模式。
index 0 初始滑动索引。
autoplay false 是否启用自动播放模式。
onIndexChanged void onIndexChanged(int index) 用户滑动或自动播放时触发回调。
onTap void onTap(int index) 用户点击 UI 时触发回调。
duration 300.0 动画持续时间(毫秒)。
pagination null 设置分页器,例如 ENSwiperPagination() 显示默认分页器。
control null 设置控制按钮,例如 ENSwiperController() 显示默认控制按钮。

分页器

分页器通过 ENSwiperPagination 实现,支持自定义样式。

默认分页器

ENSwiper(
  pagination: ENSwiperPagination(),
)

自定义分页器

ENSwiper(
  pagination: SwiperCustomPagination(
    builder: (BuildContext context, ENSwiperPluginConfig config) {
      return Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: List.generate(config.itemCount, (index) {
          return Container(
            width: 10,
            height: 10,
            margin: EdgeInsets.symmetric(horizontal: 5),
            decoration: BoxDecoration(
              shape: BoxShape.circle,
              color: index == config.activeIndex ? Colors.blue : Colors.grey,
            ),
          );
        }),
      );
    },
  ),
)

控制按钮

控制按钮通过 ENSwiperControl 实现。

ENSwiper(
  control: ENSwiperControl(),
)

自定义控制按钮

ENSwiper(
  control: SwiperControl(
    iconPrevious: Icons.arrow_back,
    iconNext: Icons.arrow_forward,
    color: Colors.red,
    size: 40,
  ),
)

控制器

控制器用于手动控制轮播的索引或自动播放状态。

final SwiperController _controller = SwiperController();

ENSwiper(
  controller: _controller,
  onTap: (int index) {
    print("Current Index: $index");
  },
);

控制器方法

方法名 描述
move(int index) 移动到指定索引,可选是否带动画。
next() 移动到下一张。
previous() 移动到上一张。
startAutoplay() 启动自动播放。
stopAutoplay() 停止自动播放。

自动播放

ENSwiper(
  autoplay: true,
  autoplayDelay: 2000, // 自动播放间隔(毫秒)
  autoplayDisableOnInteraction: true, // 手动滑动时暂停自动播放
)

内置布局

ENSwiper 支持多种内置布局。

默认布局

ENSwiper(
  itemBuilder: (BuildContext context, int index) {
    return Image.network("https://via.placeholder.com/288x188");
  },
  itemCount: 10,
  viewportFraction: 0.8,
  scale: 0.9,
)

堆叠布局

ENSwiper(
  itemBuilder: (BuildContext context, int index) {
    return Image.network("https://via.placeholder.com/288x188");
  },
  itemCount: 10,
  itemWidth: 300.0,
  layout: SwiperLayout.STACK,
)

推卡片布局

ENSwiper(
  itemBuilder: (BuildContext context, int index) {
    return Image.network("https://via.placeholder.com/288x188");
  },
  itemCount: 10,
  itemWidth: 300.0,
  itemHeight: 400.0,
  layout: SwiperLayout.TINDER,
)

自定义动画

可以通过 CustomLayoutOption 创建自定义动画。

ENSwiper(
  layout: SwiperLayout.CUSTOM,
  customLayoutOption: CustomLayoutOption(
    startIndex: -1,
    stateCount: 3,
  )..addRotate([
    -45.0 / 180,
    0.0,
    45.0 / 180,
  ])..addTranslate([
    Offset(-370.0, -40.0),
    Offset(0.0, 0.0),
    Offset(370.0, -40.0),
  ]),
  itemWidth: 300.0,
  itemHeight: 200.0,
  itemBuilder: (context, index) {
    return Container(
      color: Colors.grey,
      child: Center(
        child: Text("$index"),
      ),
    );
  },
  itemCount: 10,
)

示例代码

ConstrainedBox(
  child: ENSwiper(
    outer: false,
    itemBuilder: (c, i) {
      return Wrap(
        runSpacing: 6.0,
        children: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) {
          return SizedBox(
            width: MediaQuery.of(context).size.width / 5,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                SizedBox(
                  child: Container(
                    child: Image.network(
                      "https://fuss10.elemecdn.com/c/db/d20d49e5029281b9b73db1c5ec6f9jpeg.jpeg%3FimageMogr/format/webp/thumbnail/!90x90r/gravity/Center/crop/90x90",
                    ),
                  ),
                  height: MediaQuery.of(context).size.width * 0.12,
                  width: MediaQuery.of(context).size.width * 0.12,
                ),
                Padding(
                  padding: EdgeInsets.only(top: 6.0),
                  child: Text("$i"),
                ),
              ],
            ),
          );
        }).toList(),
      );
    },
    pagination: ENSwiperPagination(
      margin: EdgeInsets.all(5.0),
    ),
    itemCount: 10,
  ),
  constraints: BoxConstraints.loose(Size(screenWidth, 170.0)),
),

常见问题

如何移除默认控制按钮?

不传递任何值给 control 参数即可:

ENSwiper(
  control: null,
)

如何移除默认分页器?

不传递任何值给 pagination 参数即可:

ENSwiper(
  pagination: null,
)

更多关于Flutter轮播组件插件en_card_swiper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter轮播组件插件en_card_swiper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


en_card_swiper 是一个用于 Flutter 的轮播组件插件,它允许你创建卡片式的轮播效果。这个插件通常用于展示一组卡片,用户可以通过滑动来浏览这些卡片。

安装

首先,你需要在 pubspec.yaml 文件中添加 en_card_swiper 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  en_card_swiper: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

以下是一个简单的示例,展示如何使用 en_card_swiper 插件来创建一个卡片轮播:

import 'package:flutter/material.dart';
import 'package:en_card_swiper/en_card_swiper.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Card Swiper Example'),
        ),
        body: CardSwiperExample(),
      ),
    );
  }
}

class CardSwiperExample extends StatelessWidget {
  final List<String> cards = [
    'Card 1',
    'Card 2',
    'Card 3',
    'Card 4',
    'Card 5',
  ];

  @override
  Widget build(BuildContext context) {
    return Center(
      child: CardSwiper(
        cardsCount: cards.length,
        cardBuilder: (context, index) {
          return Card(
            child: Center(
              child: Text(cards[index]),
            ),
          );
        },
        onSwipe: (index, direction) {
          print('Swiped card $index to $direction');
        },
      ),
    );
  }
}

参数说明

  • cardsCount: 卡片的总数量。
  • cardBuilder: 用于构建卡片的回调函数,接收 contextindex 参数,返回一个 Widget
  • onSwipe: 当卡片被滑动时的回调函数,接收 indexdirection 参数。

自定义选项

en_card_swiper 还提供了一些自定义选项,例如:

  • cardWidth: 卡片的宽度。
  • cardHeight: 卡片的高度。
  • cardPadding: 卡片之间的间距。
  • swipeThreshold: 滑动的阈值,决定卡片何时被认定为已滑动。
  • swipeDirection: 允许的滑动方向(左、右、上、下)。

示例代码

CardSwiper(
  cardsCount: cards.length,
  cardBuilder: (context, index) {
    return Card(
      child: Center(
        child: Text(cards[index]),
      ),
    );
  },
  onSwipe: (index, direction) {
    print('Swiped card $index to $direction');
  },
  cardWidth: 300,
  cardHeight: 200,
  cardPadding: 16,
  swipeThreshold: 0.5,
  swipeDirection: SwipeDirection.horizontal,
)
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!