Flutter轮播图插件page_swiper的使用

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

Flutter轮播图插件 page_swiper 的使用

page_swiper 是一个用于构建多页面滚动UI的Flutter插件,提供了简单的API和充分的自定义选项。它特别适合需要带有标题栏或过渡动画的复杂UI设计。

特性

  • 支持创建水平可滚动的 PageView
  • 提供持久化的标题栏,并支持每个页面的标题、副标题和操作按钮
  • 处理设计和过渡动画,帮助开发者更专注于页面逻辑

示例效果

示例GIF

开始使用

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

dependencies:
  page_swiper: ^latest_version

然后运行以下命令安装包:

flutter pub add page_swiper

使用方法

初始化控制器

在你的根页面组件中初始化 PageController 和多个 ScrollController,每个页面对应一个 ScrollController

class MainPage extends StatefulWidget {
  static const pageNum = 2;

  const MainPage({
    this.initialPage = 1,
    this.titleHeight = 250,
    this.titleHeightCollapsed = 100,
    super.key,
  });

  final int initialPage;
  final double titleHeight;
  final double titleHeightCollapsed;

  @override
  State<MainPage> createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  late PageController _pageController;
  late List<ScrollController> _pageScrollControllers;

  @override
  void initState() {
    _pageController = PageController(initialPage: widget.initialPage);
    _pageScrollControllers = [
      for (int i = 0; i < MainPage.pageNum; i++) ScrollController()
    ];
    super.initState();
  }

  @override
  void dispose() {
    _pageController.dispose();
    for (var controller in _pageScrollControllers) {
      controller.dispose();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageSwiper(
        pageNum: 2,
        pageController: _pageController,
        titleHeight: widget.titleHeight,
        titleHeightCollapsed: widget.titleHeightCollapsed,
        titleFilterBackground: Colors.white.withAlpha(150),
        titleFilterSigma: 50,
        blurByPage: false,
        titleMaxExtend: 1.3,
        titles: [
          PageTitle.builder(
            title: "All Photos",
            subtitle: "All photo page",
            actions: [
              TextButton(
                onPressed: () {},
                style: TextButton.styleFrom(tapTargetSize: MaterialTapTargetSize.shrinkWrap),
                child: const Text("Select"),
              ),
            ],
          ),
          PageTitle.builder(
            title: "Albums",
            subtitle: "Photo albums",
          ),
        ],
        pages: [
          PageContainer.childBuilder(
            child: FirstPage(
              controller: _pageScrollControllers[0],
              titleHeight: widget.titleHeight,
            ),
          ),
          PageContainer.childBuilder(
            child: SecondPage(
              controller: _pageScrollControllers[1],
              titleHeight: widget.titleHeight,
            ),
          ),
        ],
        pageScrollControllers: _pageScrollControllers,
      ),
    );
  }
}

设置标题

标题通过 PageTitle.builder 构建,可以在其中设置标题文本、副标题文本以及操作按钮。

PageTitle.builder(
  title: "Page 1",
  subtitle: "Page 1 subtitle",
  actions: [
    TextButton(onPressed: () {}, child: const Text("Push Me")),
  ],
)

设置页面

页面通过 PageContainerBuilder 构建。每个页面应当是一个继承自 CustomScrollView 的组件,并且需要包含一个 PageTitlePlaceholder 来预留标题栏的空间。

import 'package:flutter/material.dart';

class DemoPage extends StatefulWidget {
  const DemoPage({
    required this.controller,
    required this.titleHeight,
    super.key,
  });

  final ScrollController controller;
  final double titleHeight;

  @override
  State<DemoPage> createState() => _DemoPageState();
}

class _DemoPageState extends State<DemoPage> with AutomaticKeepAliveClientMixin {
  @override
  bool get wantKeepAlive => true;

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Stack(
      children: [
        Positioned.fill(
          child: CustomScrollView(
            controller: widget.controller,
            physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
            slivers: [
              PageTitlePlaceholder(height: widget.titleHeight),
              // 其他Sliver组件
            ],
          ),
        ),
      ],
    );
  }
}

最后,使用 PageContainer.childBuilder 将页面加入到 PageSwiperpages 列表中:

PageContainer.childBuilder(
  child: DemoPage(
    controller: _pageScrollControllers[0],
    titleHeight: widget.titleHeight,
  ),
)

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

1 回复

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


当然,以下是如何在Flutter中使用page_swiper插件来实现轮播图的一个基本示例。page_swiper是一个流行的Flutter插件,用于创建轮播图效果。

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

dependencies:
  flutter:
    sdk: flutter
  page_swiper: ^x.y.z  # 请将x.y.z替换为最新版本号

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

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

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<String> imageUrls = [
    'https://example.com/image1.jpg',
    'https://example.com/image2.jpg',
    'https://example.com/image3.jpg',
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Page Swiper Demo'),
      ),
      body: Center(
        child: PageSwiper(
          itemBuilder: (BuildContext context, int index) {
            return Image.network(
              imageUrls[index],
              fit: BoxFit.cover,
            );
          },
          itemCount: imageUrls.length,
          autoPlay: true,  // 自动播放
          autoPlayInterval: 3000,  // 自动播放间隔(毫秒)
          loop: true,  // 循环播放
          pagination: new Pagination(
            dotsBuilder: (BuildContext context, int index, bool isActive) {
              return Container(
                margin: EdgeInsets.symmetric(horizontal: 4.0),
                decoration: BoxDecoration(
                  shape: BoxShape.circle,
                  color: isActive ? Colors.white : Colors.grey.withOpacity(0.5),
                ),
                width: 10.0,
                height: 10.0,
              );
            },
          ),
          controlButtons: new ControlButtons(
            prevButton: Icon(Icons.arrow_back_ios),
            nextButton: Icon(Icons.arrow_forward_ios),
          ),
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖导入

    • 导入flutter/material.dart用于基本的Flutter UI组件。
    • 导入page_swiper/page_swiper.dart用于轮播图组件。
  2. 主应用

    • MyApp是一个StatelessWidget,定义了应用的主题和主页。
  3. 主页

    • MyHomePage是一个StatefulWidget,它包含一个状态,即图片URL列表。
    • _MyHomePageState中,我们定义了build方法,它返回一个包含PageSwiperScaffold
  4. PageSwiper

    • itemBuilder:定义了每个页面(或轮播项)的内容。在这里,我们使用Image.network从网络加载图片。
    • itemCount:定义了轮播项的数量。
    • autoPlay:是否自动播放。
    • autoPlayInterval:自动播放的间隔时间(毫秒)。
    • loop:是否循环播放。
    • pagination:定义了分页指示器的样式。在这里,我们使用了简单的圆点指示器。
    • controlButtons:定义了控制按钮的图标。

你可以根据需要调整这些参数和样式,以实现你想要的轮播图效果。

回到顶部