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
。此控制器还提供了诸如jumpToItem
、animateToItem
、nextItem
和previousItem
等有用的功能,以及智能的动画持续时间和曲线默认值。
同样,CustomCarousel
默认使用CustomCarouselScrollPhysics
,这使选中的项能够“稳定”(即弹跳)。通过设置sticky
和stiffness
属性来调整物理行为。如果你不希望有这种功能,可以使用其他滚动物理效果(如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
更多关于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),
);
}
}
代码解释
-
依赖导入:
- 导入
flutter_custom_carousel
插件和 Flutter 的基本库。
- 导入
-
主应用:
- 使用
MaterialApp
创建一个简单的 Flutter 应用。
- 使用
-
主页:
- 创建一个
StatefulWidget
,用于管理轮播图的状态。 - 定义一个图片 URL 列表
images
。
- 创建一个
-
轮播图:
- 使用
CustomCarousel
小部件创建轮播图。 - 配置轮播图的各种属性,如高度、视口比例、是否自动播放、是否放大中心页面等。
- 使用
map
方法将图片 URL 列表转换为CarouselOptions
列表。 - 监听
onPageChanged
回调,更新当前索引并打印日志。
- 使用
-
网络图片:
- 定义一个
NetworkImage
小部件,用于加载网络图片,并显示加载进度和错误图标。
- 定义一个
这个示例展示了如何使用 flutter_custom_carousel
插件来创建一个基本的自定义轮播图,并处理页面切换事件。你可以根据需要进一步定制和扩展这个示例。