Flutter轮播图插件flutter_swiper_ms的使用

Flutter轮播图插件flutter_swiper_ms的使用

简介

flutter_swiper_ms 是一个功能强大的 Flutter 轮播图插件,支持多种样式和配置。通过该插件,您可以轻松实现水平、垂直、分数样式等多种轮播效果,并且可以自定义分页器和控制器。

以下是一个完整的示例,展示如何在 Flutter 应用中使用 flutter_swiper_ms 插件。


添加依赖

pubspec.yaml 文件中添加依赖:

dependencies:
  flutter_swiper_ms: ^0.0.1

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

flutter pub get

示例代码

主应用文件

import 'dart:ui';

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

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

class MyScrollBehavior extends MaterialScrollBehavior {
  [@override](/user/override)
  Set<PointerDeviceKind> get dragDevices => {
        PointerDeviceKind.touch,
        PointerDeviceKind.mouse,
      };
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      scrollBehavior: MyScrollBehavior(),
      title: 'Flutter Swiper Example',
      theme: ThemeData.light(),
      home: const MyHomePage(title: 'Flutter Swiper'),
      routes: {
        '/example01': (context) => const ExampleHorizontal(),
        '/example02': (context) => const ExampleVertical(),
        '/example03': (context) => const ExampleFraction(),
        '/example04': (context) => const ExampleCustomPagination(),
        '/example05': (context) => const ExamplePhone(),
        '/example06': (context) => const ScaffoldWidget(
              child: ExampleSwiperInScrollView(),
              title: 'ScrollView',
            ),
        '/example07': (context) => const ScaffoldWidget(
              child: ExampleCustom(),
              title: 'Custom All',
            )
      },
    );
  }
}

主页面

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

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Widget> render(BuildContext context, List<List<String>> children) {
    return ListTile.divideTiles(
      context: context,
      tiles: children.map((data) {
        return buildListTile(context, data[0], data[1], data[2]);
      }),
    ).toList();
  }

  Widget buildListTile(
      BuildContext context, String title, String subtitle, String url) {
    return ListTile(
      onTap: () {
        Navigator.of(context).pushNamed(url);
      },
      isThreeLine: true,
      dense: false,
      leading: null,
      title: Text(title),
      subtitle: Text(subtitle),
      trailing: const Icon(
        Icons.arrow_right,
        color: Colors.blueAccent,
      ),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ListView(
        children: render(context, [
          ['Horizontal', '水平滚动', '/example01'],
          ['Vertical', '垂直滚动', '/example02'],
          ['Fraction', '分数样式', '/example03'],
          ['Custom Pagination', '自定义分页器', '/example04'],
          ['Phone', '手机视图', '/example05'],
          ['ScrollView', '嵌套在ScrollView中', '/example06'],
          ['Custom', '完全自定义属性', '/example07']
        ]),
      ),
    );
  }
}

水平轮播图

class ExampleHorizontal extends StatelessWidget {
  const ExampleHorizontal({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('水平轮播图'),
      ),
      body: Swiper(
        itemBuilder: (context, index) {
          final image = images[index]; // 假设 images 是预定义的图片列表
          return Image.asset(
            image,
            fit: BoxFit.fill,
          );
        },
        indicatorLayout: PageIndicatorLayout.COLOR,
        autoplay: true,
        itemCount: images.length,
        pagination: const SwiperPagination(),
        control: const SwiperControl(),
      ),
    );
  }
}

垂直轮播图

class ExampleVertical extends StatelessWidget {
  const ExampleVertical({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('垂直轮播图'),
        ),
        body: Swiper(
          itemBuilder: (context, index) {
            return Image.asset(
              images[index],
              fit: BoxFit.fill,
            );
          },
          autoplay: true,
          itemCount: images.length,
          scrollDirection: Axis.vertical,
          pagination: const SwiperPagination(alignment: Alignment.centerRight),
          control: const SwiperControl(),
        ));
  }
}

分数样式轮播图

class ExampleFraction extends StatelessWidget {
  const ExampleFraction({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('分数样式轮播图'),
        ),
        body: Column(
          children: <Widget>[
            Expanded(
                child: Swiper(
              itemBuilder: (context, index) {
                return Image.asset(
                  images[index],
                  fit: BoxFit.fill,
                );
              },
              autoplay: true,
              itemCount: images.length,
              pagination:
                  const SwiperPagination(builder: SwiperPagination.fraction),
              control: const SwiperControl(),
            )),
            Expanded(
                child: Swiper(
              itemBuilder: (context, index) {
                return Image.asset(
                  images[index],
                  fit: BoxFit.fill,
                );
              },
              autoplay: true,
              itemCount: images.length,
              scrollDirection: Axis.vertical,
              pagination: const SwiperPagination(
                  alignment: Alignment.centerRight,
                  builder: SwiperPagination.fraction),
            ))
          ],
        ));
  }
}

自定义分页器

class ExampleCustomPagination extends StatelessWidget {
  const ExampleCustomPagination({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('自定义分页器'),
        ),
        body: Column(
          children: <Widget>[
            Expanded(
              child: Swiper(
                itemBuilder: (context, index) {
                  return Image.asset(
                    images[index],
                    fit: BoxFit.fill,
                  );
                },
                autoplay: true,
                itemCount: images.length,
                pagination: SwiperPagination(
                    margin: EdgeInsets.zero,
                    builder: SwiperCustomPagination(builder: (context, config) {
                      return ConstrainedBox(
                        child: Container(
                          color: Colors.white,
                          child: Text(
                            '${titles[config.activeIndex]} ${config.activeIndex + 1}/${config.itemCount}',
                            style: const TextStyle(fontSize: 20.0),
                          ),
                        ),
                        constraints: const BoxConstraints.expand(height: 50.0),
                      );
                    })),
                control: const SwiperControl(),
              ),
            ),
            Expanded(
              child: Swiper(
                itemBuilder: (context, index) {
                  return Image.asset(
                    images[index],
                    fit: BoxFit.fill,
                  );
                },
                autoplay: true,
                itemCount: images.length,
                pagination: SwiperPagination(
                    margin: EdgeInsets.zero,
                    builder: SwiperCustomPagination(builder: (context, config) {
                      return ConstrainedBox(
                        child: Row(
                          children: <Widget>[
                            Text(
                              '${titles[config.activeIndex]} ${config.activeIndex + 1}/${config.itemCount}',
                              style: const TextStyle(fontSize: 20.0),
                            ),
                            Expanded(
                              child: Align(
                                alignment: Alignment.centerRight,
                                child: const DotSwiperPaginationBuilder(
                                        color: Colors.black12,
                                        activeColor: Colors.black,
                                        size: 10.0,
                                        activeSize: 20.0)
                                    .build(context, config),
                              ),
                            )
                          ],
                        ),
                        constraints: const BoxConstraints.expand(height: 50.0),
                      );
                    })),
                control: const SwiperControl(color: Colors.redAccent),
              ),
            )
          ],
        ));
  }
}

手机视图

class ExamplePhone extends StatelessWidget {
  const ExamplePhone({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('手机视图'),
      ),
      body: Stack(
        children: <Widget>[
          ConstrainedBox(
            constraints: const BoxConstraints.expand(),
            child: Image.asset(
              'images/bg.jpeg',
              fit: BoxFit.fill,
            ),
          ),
          Swiper.children(
            autoplay: false,
            pagination: const SwiperPagination(
                margin: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 30.0),
                builder: DotSwiperPaginationBuilder(
                    color: Colors.white30,
                    activeColor: Colors.white,
                    size: 20.0,
                    activeSize: 20.0)),
            children: <Widget>[
              Image.asset(
                'images/1.png',
                fit: BoxFit.contain,
              ),
              Image.asset(
                'images/2.png',
                fit: BoxFit.contain,
              ),
              Image.asset('images/3.png', fit: BoxFit.contain)
            ],
          )
        ],
      ),
    );
  }
}
1 回复

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


flutter_swiper_ms 是一个用于 Flutter 的轮播图插件,基于 flutter_swiper 进行了一些改进和优化。使用这个插件可以轻松地实现轮播图效果。以下是如何使用 flutter_swiper_ms 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_swiper_ms: ^1.0.0  # 请检查最新版本

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

2. 基本使用

在你的 Dart 文件中导入 flutter_swiper_ms 并使用 Swiper 组件来创建轮播图。

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

class MyHomePage extends StatelessWidget {
  final List<String> images = [
    'https://via.placeholder.com/350x150',
    'https://via.placeholder.com/350x150/ff0000',
    'https://via.placeholder.com/350x150/00ff00',
    'https://via.placeholder.com/350x150/0000ff',
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Swiper MS Demo'),
      ),
      body: Swiper(
        itemBuilder: (BuildContext context, int index) {
          return Image.network(images[index], fit: BoxFit.cover);
        },
        itemCount: images.length,
        pagination: SwiperPagination(),
        control: SwiperControl(),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: MyHomePage(),
));

3. 配置参数

Swiper 组件提供了许多可配置的参数,以下是一些常用的配置:

  • itemBuilder: 用于构建每个轮播项的构建器。
  • itemCount: 轮播项的数量。
  • pagination: 分页指示器,可以设置为 SwiperPagination() 来显示默认的分页指示器。
  • control: 控制按钮,可以设置为 SwiperControl() 来显示默认的控制按钮。
  • autoplay: 是否自动播放,默认为 false
  • duration: 自动播放的间隔时间,默认为 3000 毫秒。
  • loop: 是否循环播放,默认为 true
  • scrollDirection: 滚动方向,可以是 Axis.horizontal(水平)或 Axis.vertical(垂直)。

4. 自定义分页指示器和控制按钮

你可以通过 SwiperPaginationSwiperControl 来自定义分页指示器和控制按钮的外观。

Swiper(
  itemBuilder: (BuildContext context, int index) {
    return Image.network(images[index], fit: BoxFit.cover);
  },
  itemCount: images.length,
  pagination: SwiperPagination(
    builder: DotSwiperPaginationBuilder(
      color: Colors.grey,
      activeColor: Colors.blue,
    ),
  ),
  control: SwiperControl(
    color: Colors.blue,
  ),
)
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!