Flutter卡片滑动插件card_slider的使用

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

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

1 回复

更多关于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:一个卡片小部件的列表。
  • cardWidthcardHeight:卡片的宽度和高度。
  • expandedCardHeight:当卡片被展开时的高度。
  • cardElevation:卡片的阴影大小。
  • cardBorderRadius:卡片的圆角大小。
  • scrollPhysics:滚动的物理效果。
  • showShadow:是否显示卡片阴影。
  • initialIndex:初始显示的卡片索引。
  • onCardSwiped:当卡片被滑动时调用的回调。

你可以根据需要调整这些属性来定制你的卡片滑动视图。

回到顶部