Flutter卡片滑动插件card_slider的使用
Flutter卡片滑动插件 card_slider
的使用
card_slider
是一个支持在Flutter中实现卡片轮播的插件,它可以在Android和iOS上工作。这个插件允许用户通过滑动或拖拽来浏览图片或自定义小部件。本文将详细介绍如何安装和使用card_slider
插件,并提供完整的示例代码。
安装
首先,在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
card_slider: ^1.0.5
之后运行flutter pub get
以下载并安装该插件。
简单使用
使用小部件作为幻灯片
下面的例子展示了如何使用小部件作为幻灯片:
import 'package:flutter/material.dart';
import 'package:card_slider/card_slider.dart';
class CardSliderWidgetExample extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
List<Color> valuesDataColors = [
Colors.purple,
Colors.yellow,
Colors.green,
Colors.red,
Colors.grey,
Colors.blue,
];
List<Widget> valuesWidget = [];
for (int i = 0; i < valuesDataColors.length; i++) {
valuesWidget.add(Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
color: valuesDataColors[i],
),
child: Align(
alignment: Alignment.center,
child: Text(
i.toString(),
style: const TextStyle(fontSize: 28),
),
)));
}
return Scaffold(
backgroundColor: const Color(0xFF1560BD),
appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
title: const Text(
"Cards",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Colors.white),
),
centerTitle: true,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.white),
tooltip: 'Back',
onPressed: () => Navigator.of(context).pop(),
),
),
body: CardSlider(
cards: valuesWidget,
bottomOffset: .0005,
cardHeight: 0.75,
itemDotOffset: 0.25,
));
}
}
使用图片作为幻灯片
如果你想展示一系列图片,可以参考以下示例:
import 'package:flutter/material.dart';
import 'package:card_slider/card_slider.dart';
class CardSliderImageExample extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
List<String> valuesUrl = [
'https://upload.wikimedia.org/wikipedia/commons/thumb/4/42/Shaqi_jrvej.jpg/1200px-Shaqi_jrvej.jpg',
'https://img.freepik.com/free-photo/wide-angle-shot-single-tree-growing-clouded-sky-during-sunset-surrounded-by-grass_181624-22807.jpg',
'https://www.eea.europa.eu/themes/biodiversity/state-of-nature-in-the-eu/state-of-nature-2020-subtopic/image_print'
];
List<Widget> valuesWidget = valuesUrl.map((url) => Image.network(url)).toList();
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
title: const Text(
"Gallery",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xFF33a000)),
),
centerTitle: true,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Color(0xFF33a000)),
tooltip: 'Back',
onPressed: () => Navigator.of(context).pop(),
),
),
body: CardSlider(
cards: valuesWidget,
bottomOffset: .0008,
itemDotWidth: 14,
itemDotOffset: 0.15,
itemDot: (itemDotWidth) {
return Container(
margin: const EdgeInsets.all(5),
width: 8 + itemDotWidth,
height: 8,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: const Color(0xFF33a000),
));
},
),
);
}
}
在可滚动的Column中使用小部件
如果你需要在一个可滚动的列表中包含CardSlider
,可以使用如下代码:
import 'package:flutter/material.dart';
import 'package:card_slider/card_slider.dart';
class CardSliderInScrollableViewExample extends StatefulWidget {
[@override](/user/override)
_CardSliderInScrollableViewExampleState createState() => _CardSliderInScrollableViewExampleState();
}
class _CardSliderInScrollableViewExampleState extends State<CardSliderInScrollableViewExample> {
bool _dragOverMap = false;
final GlobalKey _pointerKey = GlobalKey();
void _checkDrag(Offset position, bool up) {
if (!up) {
RenderBox box = _pointerKey.currentContext!.findRenderObject() as RenderBox;
Offset boxOffset = box.localToGlobal(Offset.zero);
if (position.dy > boxOffset.dy && position.dy < boxOffset.dy + box.size.height) {
setState(() {
_dragOverMap = true;
});
}
} else {
setState(() {
_dragOverMap = false;
});
}
}
[@override](/user/override)
Widget build(BuildContext context) {
List<Color> valuesDataColors = [
Colors.purple,
Colors.yellow,
Colors.green,
Colors.red,
Colors.grey,
Colors.blue,
];
List<Widget> valuesWidget = [];
for (int i = 0; i < valuesDataColors.length; i++) {
valuesWidget.add(Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
color: valuesDataColors[i],
),
child: Align(
alignment: Alignment.center,
child: Text(
i.toString(),
style: const TextStyle(fontSize: 28),
),
)));
}
return Scaffold(
appBar: AppBar(title: const Text("Slide inside column widget")),
body: Listener(
onPointerUp: (ev) => _checkDrag(ev.position, true),
onPointerDown: (ev) => _checkDrag(ev.position, false),
child: ListView(
physics: _dragOverMap ? const NeverScrollableScrollPhysics() : const ScrollPhysics(),
children: [
Column(children: [for (int i = 0; i < 3; i++) const ListTile(title: Text("Tile to scroll")), const Divider()]),
Container(
color: Colors.amberAccent,
key: _pointerKey,
height: 350,
width: double.infinity,
child: CardSlider(
cards: valuesWidget,
bottomOffset: .0008,
cardHeight: 0.75,
containerHeight: MediaQuery.of(context).size.height - 100,
itemDotOffset: 0.55,
),
),
Column(children: [for (int i = 0; i < 3; i++) const ListTile(title: Text("Tile to scroll")), const Divider()]),
],
),
),
);
}
}
更多关于Flutter卡片滑动插件card_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter卡片滑动插件card_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用card_slider
插件的示例代码。这个插件允许你创建一个可以水平滑动的卡片视图。
首先,确保你已经在pubspec.yaml
文件中添加了card_slider
依赖:
dependencies:
flutter:
sdk: flutter
card_slider: ^x.y.z # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter项目中创建一个卡片滑动视图。以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:card_slider/card_slider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Card Slider Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: CardSliderScreen(),
);
}
}
class CardSliderScreen extends StatelessWidget {
final List<String> cardTitles = [
'Card 1',
'Card 2',
'Card 3',
'Card 4',
'Card 5',
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Card Slider Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: CardSlider(
cards: cardTitles.map((title) => _buildCard(title)).toList(),
cardWidth: 250.0, // 你可以根据需要调整卡片的宽度
cardHeight: 200.0, // 你可以根据需要调整卡片的高度
expandedCardHeight: 300.0, // 展开时卡片的高度
cardElevation: 8.0, // 卡片的阴影大小
cardBorderRadius: 16.0, // 卡片的圆角大小
scrollPhysics: BouncingScrollPhysics(), // 滚动物理效果
showShadow: true, // 是否显示卡片阴影
initialIndex: 0, // 初始显示的卡片索引
onCardSwiped: (index) {
// 当卡片被滑动时调用的回调
print('Card $index swiped');
},
),
),
);
}
Widget _buildCard(String title) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16.0),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 5,
blurRadius: 7,
offset: Offset(0, 3), // changes position of shadow
),
],
),
child: Center(
child: Text(
title,
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
),
),
),
);
}
}
在这个示例中,我们创建了一个包含几个卡片的滑动视图。每个卡片都是一个简单的Container
,里面有一个居中的Text
小部件,用于显示卡片的标题。
CardSlider
小部件的属性包括:
cards
:一个卡片小部件的列表。cardWidth
和cardHeight
:卡片的宽度和高度。expandedCardHeight
:当卡片被展开时的高度。cardElevation
:卡片的阴影大小。cardBorderRadius
:卡片的圆角大小。scrollPhysics
:滚动的物理效果。showShadow
:是否显示卡片阴影。initialIndex
:初始显示的卡片索引。onCardSwiped
:当卡片被滑动时调用的回调。
你可以根据需要调整这些属性来定制你的卡片滑动视图。