Flutter自定义轮播图插件flutter_custom_carousel的使用

Flutter 自定义轮播图插件 flutter_custom_carousel 的使用

Flutter 自定义轮播图插件 flutter_custom_carousel

这是一个用于创建完全自定义、动画滚动列表的小部件。它管理所有与滚动交互和物理相关的复杂逻辑,并将项目的视觉呈现留给你来定义。

包含一个示例应用(如上所示),其中包含多种可学习或自定义的带注释演示。

平台/设备

目前,该小部件专为触摸输入设计。在桌面端,滚轮输入可能会与滚动物理效果产生冲突。可以通过指定不同的physics来解决这个问题,但会牺牲滚动的“定型”(即弹跳)效果。

你也可以通过设置scrollBehavior在桌面端启用鼠标拖动滚动。查看示例中的main.dart以了解其用法。

类似地,包含的示例主要针对手机竖屏进行优化,以保持简洁。它们只包含基本的响应式功能。

基础

只需传入一个子项列表,并定义一个effectsBuilder函数。

effectsBuilder接受一个子项及其当前相对滚动位置(见下文的scrollRatio),并返回一个包装了应用所需效果的子项。

// 非常基础的例子,从-250px到+250px垂直滚动子项
CustomCarousel(
    children: [card1, card2, etc],
    effectsBuilder: (index, scrollRatio, child) =>
       Transform.translate(
            offset: Offset(0, scrollRatio * 250) ,
            child: child
       ),
)

你可以通过指定显示前后的子项数量、是否循环列表、默认对齐方式以及如何深度排序子项来进一步细化视觉效果。

通过改变滚动方向、物理效果和速度,启用点击选择,或者指定当选项更改时或选项稳定时的处理程序,可以调整交互。

scrollRatio

scrollRatio值范围从-1到+1,其中0是选中项的稳定位置。

以下动画展示了每个项滚动时的scrollRatio。它还突出显示了“选中”项(白色背景)和“稳定”项(粗轮廓)。

尝试逐一观察单个项,看看比率如何与选择、稳定、以及项进入/退出可见列表相关联。注意,具体值取决于itemsBefore/itemsAfter等因素。

ScrollControllers 和 ScrollPhysics

为了促进基于项目的导航和循环内容,CustomCarousel要求你使用CustomCarouselScrollController。此控制器还提供了诸如jumpToItemanimateToItemnextItempreviousItem等有用的功能,以及智能的动画持续时间和曲线默认值。

同样,CustomCarousel默认使用CustomCarouselScrollPhysics,这使选中的项能够“稳定”(即弹跳)。通过设置stickystiffness属性来调整物理行为。如果你不希望有这种功能,可以使用其他滚动物理效果(如BouncingScrollPhysics)。

使用与 Flutter Animate 结合

你还可以使用Flutter Animate来定义effectsBuilder,利用其广泛的效果集合,如淡入淡出、移动、模糊、阴影、闪烁、颜色效果、2.5D翻转等。

例如,上述简单的垂直滚动器可以这样实现:

// 非常基础的例子,从-250px到+250px垂直滚动子项
CustomCarousel(
    children: [card1, card2, etc],
    effectsBuilder: CustomCarousel.effectsBuilderFromAnimate(
        effects: EffectList().moveY(begin: -250, end: 250),
    ),
)

许多包含的示例更深入地展示了这种方法。有关更多信息,请参阅CustomCarousel.effectsBuilderFromAnimate()的文档。

API 参考

完整的文档,请参阅 API 参考

安装

pub.dev 获取。


示例代码

import 'dart:ui';

import 'package:example/views/views.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      // 启用整个应用的桌面端鼠标拖动滚动。
      // 这可以通过 `CustomCarousel.scrollBehavior` 应用于特定的轮播图。
      scrollBehavior: AppScrollBehavior(),
      theme: ThemeData.dark()
          .copyWith(scaffoldBackgroundColor: const Color(0xFF151530)),
      home: const HomeView(),
    );
  }
}

// 创建一个 ScrollBehavior 子类,以启用桌面端的鼠标拖动滚动。
class AppScrollBehavior extends ScrollBehavior {
  [@override](/user/override)
  Set<PointerDeviceKind> get dragDevices {
    final devices = Set<PointerDeviceKind>.from(super.dragDevices);
    devices.add(PointerDeviceKind.mouse);
    return devices;
  }
}

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

1 回复

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


当然,下面是一个关于如何使用 flutter_custom_carousel 插件来创建自定义轮播图的示例代码。这个示例将展示如何设置轮播图、配置其属性以及处理一些基本的事件。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_custom_carousel: ^最新版本号 # 替换为实际版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Dart 文件中使用 flutter_custom_carousel。以下是一个完整的示例:

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

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

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

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

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

  int currentIndex = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Custom Carousel'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            SizedBox(
              height: 300,
              child: CustomCarousel(
                height: 300,
                viewportFraction: 0.8,
                aspectRatio: 16 / 9,
                autoPlay: true,
                enlargeCenterPage: true,
                showIndicators: true,
                dotColor: Colors.grey,
                dotActiveColor: Colors.white,
                dotIncreaseSize: 12,
                dotSpacing: 10,
                dotBgColor: Colors.transparent,
                scrollPhysics: BouncingScrollPhysics(),
                items: images.map((url) {
                  return CarouselOptions(
                    img: NetworkImage(url),
                  );
                }).toList(),
                onPageChanged: (index, reason) {
                  setState(() {
                    currentIndex = index;
                  });
                  print('Page changed to index: $index, reason: $reason');
                },
              ),
            ),
            SizedBox(height: 20),
            Text('Current Index: $currentIndex'),
          ],
        ),
      ),
    );
  }
}

class NetworkImage extends StatelessWidget {
  final String url;

  NetworkImage(this.url);

  @override
  Widget build(BuildContext context) {
    return Image.network(
      url,
      fit: BoxFit.cover,
      loadingBuilder: (context, child, loadingProgress) {
        if (loadingProgress == null) return child;
        return Center(
          child: CircularProgressIndicator(
            value: loadingProgress.expectedTotalBytes != null
                ? loadingProgress.cumulativeBytesLoaded.toDouble() / loadingProgress.expectedTotalBytes!.toDouble()
                : null,
          ),
        );
      },
      errorWidget: (context, error, stackTrace) => Icon(Icons.error),
    );
  }
}

代码解释

  1. 依赖导入

    • 导入 flutter_custom_carousel 插件和 Flutter 的基本库。
  2. 主应用

    • 使用 MaterialApp 创建一个简单的 Flutter 应用。
  3. 主页

    • 创建一个 StatefulWidget,用于管理轮播图的状态。
    • 定义一个图片 URL 列表 images
  4. 轮播图

    • 使用 CustomCarousel 小部件创建轮播图。
    • 配置轮播图的各种属性,如高度、视口比例、是否自动播放、是否放大中心页面等。
    • 使用 map 方法将图片 URL 列表转换为 CarouselOptions 列表。
    • 监听 onPageChanged 回调,更新当前索引并打印日志。
  5. 网络图片

    • 定义一个 NetworkImage 小部件,用于加载网络图片,并显示加载进度和错误图标。

这个示例展示了如何使用 flutter_custom_carousel 插件来创建一个基本的自定义轮播图,并处理页面切换事件。你可以根据需要进一步定制和扩展这个示例。

回到顶部