Flutter轮播图插件flutter_swiper_3的使用

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

Flutter轮播图插件flutter_swiper_3的使用

在本教程中,我们将学习如何在Flutter应用中使用flutter_swiper_3插件来实现轮播图效果。此插件提供了多种配置选项,使得创建美观且功能丰富的轮播图变得非常简单。

依赖安装

首先,在你的pubspec.yaml文件中添加flutter_swiper_3依赖:

dependencies:
  flutter_swiper_3: ^3.0.0

然后运行flutter pub get命令以获取该库。

示例代码

以下是一个完整的示例,展示了如何使用flutter_swiper_3插件来创建一个简单的水平轮播图。

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

// 定义一些示例图片路径
const List<String> images = [
  "assets/images/image1.jpg",
  "assets/images/image2.jpg",
  "assets/images/image3.jpg"
];

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Swiper',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Swiper'),
      routes: {
        '/horizontal': (BuildContext context) => ExampleHorizontal(),
        '/vertical': (BuildContext context) => ExampleVertical(),
        '/fraction': (BuildContext context) => ExampleFraction(),
        '/custom-pagination': (BuildContext context) => ExampleCustomPagination(),
        '/phone': (BuildContext context) => ExamplePhone(),
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, 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 children) {
    return ListTile.divideTiles(
        context: context,
        tiles: children.map((dynamic 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,
      title: Text(title),
      subtitle: Text(subtitle),
      trailing: 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", "水平滚动", "/horizontal"],
          ["Vertical", "垂直滚动", "/vertical"],
          ["Fraction", "分数样式", "/fraction"],
          ["Custom Pagination", "自定义分页器", "/custom-pagination"],
          ["Phone", "手机视图", "/phone"],
        ]),
      ),
    );
  }
}

class ExampleHorizontal extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("水平轮播图"),
        ),
        body: Swiper(
          itemBuilder: (BuildContext context, int index) {
            return Image.asset(
              images[index],
              fit: BoxFit.fill,
            );
          },
          indicatorLayout: PageIndicatorLayout.SCALE,
          autoplay: true,
          autoplayDelay: 1000,
          itemCount: images.length,
          pagination: SwiperPagination(),
          control: SwiperControl(),
          fade: 1.0,
          viewportFraction: 0.85,
        ));
  }
}

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

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

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

class ExamplePhone extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("手机视图"),
      ),
      body: Stack(
        children: <Widget>[
          ConstrainedBox(
            constraints: BoxConstraints.expand(),
            child: Image.asset(
              "assets/images/bg.jpeg",
              fit: BoxFit.fill,
            ),
          ),
          Swiper.children(
            autoplay: true,
            pagination: 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(
                "assets/images/1.png",
                fit: BoxFit.contain,
              ),
              Image.asset(
                "assets/images/2.png",
                fit: BoxFit.contain,
              ),
              Image.asset("assets/images/3.png", fit: BoxFit.contain)
            ],
          )
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用flutter_swiper_3插件来实现轮播图的示例代码。flutter_swiper_3是一个非常流行的轮播图插件,提供了丰富的功能和配置选项。

首先,确保你已经在pubspec.yaml文件中添加了flutter_swiper_3的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_swiper_3: ^3.0.0  # 请确保使用最新版本

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

接下来,你可以在你的Flutter项目中使用flutter_swiper_3来创建一个轮播图。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_swiper_3/flutter_swiper.dart';

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

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

class MyHomePage extends StatelessWidget {
  final List<String> imageUrls = [
    'https://via.placeholder.com/600x300?text=Image+1',
    'https://via.placeholder.com/600x300?text=Image+2',
    'https://via.placeholder.com/600x300?text=Image+3',
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Swiper Demo'),
      ),
      body: Center(
        child: Container(
          height: 300,
          child: Swiper(
            itemBuilder: (BuildContext context, int index) {
              return Image.network(
                imageUrls[index],
                fit: BoxFit.cover,
              );
            },
            itemCount: imageUrls.length,
            autoplay: true,
            autoplayDelay: 2.0,
            autoplayDisableOnInteraction: false,
            pagination: SwiperPagination(
              builder: DotSwiperPaginationBuilder(),
            ),
            control: SwiperControl(),
          ),
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖导入:首先导入flutter/material.dartflutter_swiper_3/flutter_swiper.dart
  2. 主函数main()函数是Flutter应用的入口,它创建了一个MyApp实例。
  3. MyApp类MyApp是一个StatelessWidget,它创建了一个MaterialApp,并设置了应用的标题和主题。
  4. MyHomePage类MyHomePage是应用的主页,它包含了一个轮播图。
  5. 图片URL列表imageUrls是一个包含图片URL的列表。
  6. ScaffoldScaffold是Flutter中常用的布局组件,它包含了应用的标题栏(AppBar)和主体内容(body)。
  7. Swiper组件
    • itemBuilder:这是一个函数,它根据索引返回每个轮播项。这里我们返回了一个Image.network组件来显示网络图片。
    • itemCount:轮播项的数量。
    • autoplay:是否自动播放。
    • autoplayDelay:自动播放的延迟时间。
    • autoplayDisableOnInteraction:用户交互后是否停止自动播放。
    • pagination:分页指示器,这里使用了DotSwiperPaginationBuilder来显示圆点分页指示器。
    • control:控制按钮,这里使用了默认的SwiperControl

这段代码展示了如何使用flutter_swiper_3来创建一个简单的轮播图,你可以根据自己的需求进一步自定义和扩展它。

回到顶部