Flutter可滑动删除的轮播图插件dismissible_carousel_viewpager的使用

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

Flutter可滑动删除的轮播图插件dismissible_carousel_viewpager的使用

dismissible_carousel_viewpager 是一个提供轮播效果和页面移除时带有消失动画的视图分页器。

特性

  • 带有dismissal animation(移除动画)的轮播视图分页器
    • 淡出 & 滑出
    • 淡出 & 缩放
    • 淡出 & 圆形隐藏
Fade out & slide out Fade out & scale Fade out & circular hide
dismissal_fade_slide_out dismissal_fade_scale dismissal_fade_circular_hide

Web Live Demo

你可以通过 这个链接 查看插件在Web上的实时演示。

使用方法

基础用法

DismissibleCarouselViewPager(
  viewportFraction: 0.5,
  besidePageScale: 0.8,
  itemBuilder: (context, index) {
    return Container(
      alignment: Alignment.center,
      color: index.isEven
          ? Colors.blueAccent.withOpacity(0.1)
          : Colors.deepPurpleAccent.withOpacity(0.1),
      child: Text("Item:$index"),
    ); 
  },
  itemCount: 100,
);

移除动画

dismissible_carousel_viewpager 提供了多种动画(如淡出、滑出、缩放和圆形隐藏)来实现移除动画。你可以组合这些动画以创建自己的移除动画风格。

注意事项

  • 移除动画基于 AnimatedSwitcher
  • 记得为 DismissibleCarouselViewPager.itemBuilder 创建的页面小部件添加 key
  • 推荐使用准备用于创建页面小部件的数据来创建 Key("$data")ValueKey(data)ObjectKey(data) 作为页面小部件的键

示例代码

late final List<int> _item = List.generate(1000, (index) => index);

DismissibleCarouselViewPager(
  itemCount: _item.length,
  itemBuilder: (context, index) {
    Object data = _item[index];
    return Container(
      // 必须添加key
      key: Key("$data"),
      //key: ValueKey(data),
      //key: ObjectKey(data),
      alignment: Alignment.center,
      color: Colors.grey.withOpacity(0.1),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          Expanded(
            child: Container(
              alignment: Alignment.bottomCenter,
              child: Text("Item:$data"),
            ),
          ),
          Expanded(
            child: IconButton(
              icon: const Icon(Icons.delete),
              onPressed: () {
                setState(() {
                  _item.remove(data);
                });
              },
            ),
          ),
        ],
      ),
    );
  },
  dismissalConfig: DismissalConfig(
    dismissalTypes: [
      DismissalType.fadeOut(),
      DismissalType.slideOut(),
    ],
  ),
);

完整示例Demo

下面是一个完整的示例应用程序,展示了如何使用 dismissible_carousel_viewpager 插件:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

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

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late final List<int> _items = List.generate(10, (index) => index);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: DismissibleCarouselViewPager(
          itemCount: _items.length,
          itemBuilder: (context, index) {
            int data = _items[index];
            return Container(
              key: ValueKey(data),
              alignment: Alignment.center,
              color: Colors.primaries[data % Colors.primaries.length],
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Text("Item $data"),
                  IconButton(
                    icon: const Icon(Icons.delete),
                    onPressed: () {
                      setState(() {
                        _items.removeAt(index);
                      });
                    },
                  ),
                ],
              ),
            );
          },
          dismissalConfig: DismissalConfig(
            dismissalTypes: [
              DismissalType.fadeOut(),
              DismissalType.slideOut(),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个包含10个项目的列表,并将其展示在一个 DismissibleCarouselViewPager 中。每个项目都有一个删除按钮,点击后可以将该项目从列表中移除,并触发相应的移除动画。


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

1 回复

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


当然,以下是如何在Flutter项目中使用dismissible_carousel_viewpager插件来实现可滑动删除的轮播图的示例代码。dismissible_carousel_viewpager是一个扩展自carousel_slider的插件,它添加了可滑动删除的功能。

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

dependencies:
  flutter:
    sdk: flutter
  dismissible_carousel_viewpager: ^最新版本号 # 请替换为实际发布的最新版本号

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

接下来,你可以在你的Flutter项目中实现一个可滑动删除的轮播图。以下是一个完整的示例代码:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final List<String> images = [
    'https://via.placeholder.com/600x300?text=Image+1',
    'https://via.placeholder.com/600x300?text=Image+2',
    'https://via.placeholder.com/600x300?text=Image+3',
    'https://via.placeholder.com/600x300?text=Image+4',
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dismissible Carousel ViewPager Demo'),
      ),
      body: Center(
        child: DismissibleCarouselViewPager(
          scrollPhysics: BouncingScrollPhysics(),
          enlargeCenterPage: true,
          autoPlay: true,
          autoPlayInterval: Duration(seconds: 3),
          autoPlayAnimationDuration: Duration(milliseconds: 800),
          autoPlayCurve: Curves.fastOutSlowIn,
          viewportFraction: 0.8,
          aspectRatio: 2 / 1,
          itemCount: images.length,
          onPageChanged: (index) {
            print('Page changed to index $index');
          },
          onDismissed: (index) {
            setState(() {
              images.removeAt(index);
            });
          },
          builder: (BuildContext context, int index, RealIndex realIndex) {
            return Container(
              margin: EdgeInsets.all(8.0),
              decoration: BoxDecoration(
                image: DecorationImage(
                  image: NetworkImage(images[index]),
                  fit: BoxFit.cover,
                ),
                borderRadius: BorderRadius.circular(12),
              ),
            );
          },
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先导入了必要的包,包括dismissible_carousel_viewpager
  2. 创建了一个包含图片URL的列表images
  3. _MyHomePageState中,我们构建了一个Scaffold,其中包含了一个AppBar和一个居中的DismissibleCarouselViewPager
  4. DismissibleCarouselViewPager接受多个参数,包括:
    • scrollPhysics:滚动物理属性。
    • enlargeCenterPage:是否放大中心页面。
    • autoPlay:是否自动播放。
    • autoPlayInterval:自动播放的间隔时间。
    • autoPlayAnimationDuration:自动播放动画的持续时间。
    • autoPlayCurve:自动播放的动画曲线。
    • viewportFraction:可视页面比例。
    • aspectRatio:宽高比。
    • itemCount:项目总数。
    • onPageChanged:页面更改时的回调。
    • onDismissed:项目被删除时的回调。
    • builder:用于构建每个项目的Widget。

当用户向左或向右滑动以删除图片时,onDismissed回调会被触发,并从images列表中移除相应的图片。

请确保你替换了占位符URL为实际的图片URL,或者将图片资源放在你的项目资源中并使用本地路径。

回到顶部