首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Flutter -在PageView上使用Dismissible创建丑陋的动画

在使用Flutter的PageView结合Dismissible时,可能会遇到动画效果不佳的问题。这通常是由于PageViewDismissible的动画系统之间的冲突导致的。以下是一些基础概念和相关解决方案:

基础概念

  1. PageView: 一个可以水平或垂直滚动的页面容器,常用于实现轮播图或多页应用。
  2. Dismissible: 允许用户通过滑动来删除或执行某个动作的Widget。

问题原因

PageViewDismissible都有自己的动画系统。当两者结合使用时,可能会出现动画冲突,导致视觉上的不协调,例如滑动删除时的动画看起来很“丑陋”。

解决方案

为了解决这个问题,可以尝试以下几种方法:

方法一:自定义动画

通过自定义动画来协调PageViewDismissible的行为。

代码语言:txt
复制
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('PageView with Dismissible')),
        body: PageView.builder(
          itemCount: 10,
          itemBuilder: (context, index) {
            return Dismissible(
              key: Key(index.toString()),
              direction: DismissDirection.horizontal,
              onDismissed: (direction) {
                print('Dismissed $index');
              },
              background: Container(color: Colors.red),
              child: ListTile(title: Text('Item $index')),
            );
          },
        ),
      ),
    );
  }
}

方法二:使用PageView.builderIndexedStack

使用IndexedStack来保持页面的状态,并结合PageView.builder来优化动画。

代码语言:txt
复制
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('PageView with Dismissible')),
        body: IndexedStack(
          index: _currentIndex,
          children: List.generate(10, (index) {
            return Dismissible(
              key: Key(index.toString()),
              direction: DismissDirection.horizontal,
              onDismissed: (direction) {
                setState(() {
                  _items.removeAt(index);
                  _currentIndex = _currentIndex < _items.length ? _currentIndex : _items.length - 1;
                });
              },
              background: Container(color: Colors.red),
              child: ListTile(title: Text('Item $index')),
            );
          }),
        ),
      ),
    );
  }

  int _currentIndex = 0;
  List<int> _items = List.generate(10, (index) => index);
}

方法三:调整滑动灵敏度

通过调整Dismissible的滑动灵敏度来改善动画效果。

代码语言:txt
复制
Dismissible(
  key: Key(index.toString()),
  direction: DismissDirection.horizontal,
  onDismissed: (direction) {
    print('Dismissed $index');
  },
  background: Container(color: Colors.red),
  child: ListTile(title: Text('Item $index')),
  confirmDismiss: (direction) async {
    return await showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Confirm'),
          content: Text('Are you sure you want to dismiss this item?'),
          actions: <Widget>[
            TextButton(
              child: Text('No'),
              onPressed: () {
                Navigator.of(context).pop(false);
              },
            ),
            TextButton(
              child: Text('Yes'),
              onPressed: () {
                Navigator.of(context).pop(true);
              },
            ),
          ],
        );
      },
    );
  },
);

应用场景

  • 轮播图应用:在轮播图中允许用户通过滑动删除某个页面。
  • 多页应用:在多页应用中,允许用户通过滑动删除某个页面。

通过上述方法,可以有效改善PageView结合Dismissible时的动画效果,使其更加流畅和美观。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )

文章目录 ◯、AnimatedBuilder 引入 一、创建动画控制器 二、创建动画 三、创建动画作用的组件 四、创建 AnimatedBuilder 关联动画与组件 五、动画运行 六、完整代码示例 七...、相关资源 AnimatedBuilder 动画使用流程 : ① 创建动画控制器 ② 创建动画 ③ 创建动画作用的组件 ④ 创建 AnimatedBuilder 关联动画与组件 ⑤ 执行动画 ◯、AnimatedBuilder...引入 ---- 在上一篇博客 【Flutter】Animation 动画 ( AnimatedWidget 动画使用流程 | 创建动画控制器 | 创建动画 | 创建 AnimatedWidget 动画组件...| 动画运行 ) 中 , 使用了 AnimatedWidget 组件实现动画 , 省略了手动添加监听器 , 并在监听器中手动调用 setState 更新动画的操作 ; 使用 AnimatedWidget...渲染到组件上 AnimatedBuilder 在监听机制上与 AnimatedWidget 类似 , 也是自动添加监听器 , 监听动画的执行过程 , 自动调用 setState 方法更新界面 ; 一、

1.8K10

Flutter 构建完整应用手册-处理手势

添加材质涟漪效果 在设计应遵循材质设计指南的应用程序时,我们希望在点击时将涟漪动画添加到部件。 Flutter提供InkWell部件来达到这个效果。...路线 创建条目列表 将每个项目包裹在Dismissible部件中 提供“向后消除”指标 1.创建条目列表 这个配方的第一步是创建一个我们可以滑动的项目列表。...有关如何创建列表的更多详细说明,请按照使用长列表配方进行操作。 创建一个数据源 在我们的例子中,我们需要20个样品条目。 为了简单起见,我们将生成一个字符串列表。...在真实的应用程序中,您可能需要执行更复杂的逻辑,例如从Web服务或数据库中删除项目。 这是Dismissible部件发挥作用的地方!...在我们的例子中,我们将更新我们的itemBuilder函数以返回一个Dismissible部件。

1.8K20
  • 【Flutter】底部导航栏实现 ( BottomNavigationBar 底部导航栏 | BottomNavigationBarItem 导航栏条目 | PageView )

    onTap 点击事件 , BottomNavigationBar 组件需要设置组件的类型 , 在 BottomNavigationBarType?..., /// 都会根据当前点击的选项而改变 , /// 改变的时候有切换动画 /// 选中的状态下显示底部图标的文本 /// 不选中的状态下隐藏底部的文本内容 shifting...child: Center( /// 垂直方向的线性布局 child: Column( /// 在主轴 ( 垂直方向 ) 占据的大小.../docs/ Flutter 相关问题 : https://flutterchina.club/faq/ ( 入门阶段推荐看一遍 ) GitHub 上的 Flutter 开源示例 : https://download.csdn.net...动画参考文档 : https://flutterchina.club/animations/ 博客源码下载 : GitHub 地址 : https://github.com/han1202012/flutter_frame

    6.2K50

    Flutter开发实战分析-animation_demo瞎复写总结

    简单的分析一下 上下滚动,并且自定义动画效果。嗯。上一遍文章的CustomScrollView 左右滚动,切换页面。嗯。PageView。 PageView可以让像是一页一页滑动。...而且每个页面的大小是一样的。 使用PageController 来进行控制。 上下要同时切换。肯定也需要上下两个PageView的状态同步。 第一次接触 先准备好数据。...确定中间状态 tColumnToRow 整体的动画,在Flutter中有很方便的lerp函数可以确定中间的状态。只要传入我们进度的百分比就可以。这个百分比可以由滑动的过程中的offset传入。...target-20180814215213.gif 这样,我们就做成很接近最后效果的动画了。要实现最后的动画,只要用相同的办法去创建title和indicator就行了。...自定义动画的过程 自定义动画的过程,在Flutter中其实相对简单。提供了很多帮助的计算方式。需要做的是确定要初始值,和最终值,中间的过度变量可以考虑使用lerp就可以完成。

    2.5K30

    掌握Flutter底部导航栏:畅游导航之旅

    在Flutter中,开发者可以使用内置的BottomNavigationBar组件轻松创建和定制底部导航栏,同时结合其他Flutter组件和功能实现更丰富的导航体验。...在接下来的章节中,我们将深入探讨如何在Flutter中创建和定制底部导航栏,包括基本结构的构建、外观的定制、与页面的切换以及状态管理等方面的内容,帮助读者全面掌握底部导航栏的实现技巧与方法。 3....创建底部导航栏的基本结构 底部导航栏在Flutter中的创建可以通过两个主要的组件来实现:BottomNavigationBar和BottomNavigationBarItem。...3.1 使用BottomNavigationBar BottomNavigationBar是Flutter提供的一个内置组件,用于创建底部导航栏。...在Flutter中,实现底部导航栏与页面切换通常有两种常见的方式:使用IndexedStack和利用PageView。本节将分别介绍这两种方式的实现方法。

    48010

    Flutter开发实战分析-animation_demo解析导读

    确定中间状态 tColumnToRow 整体的动画,在Flutter中有很方便的lerp函数可以确定中间的状态。只要传入我们进度的百分比就可以。这个百分比可以由滑动的过程中的offset传入。...LayoutBuilder 上一遍文章,就介绍过,使用LayoutBuilder可以得到变化的约束。来构建动画效果。这里也一样。根据滑动时,变化的约束,来计算百分比。来确定中间状态。...return new LayoutBuilder(builder: _build); } } ---- 横向翻页的效果 头部和下面的部分,都使用Flutter自带提供的PageView就可以实现了...AlwaysScrollableScrollPhysics,在Android上和ClampingScrollPhysics一样,在IOS上和BouncingScrollPhysics一样。...动画分析 这个动画中,有两种处理。 PageView 因为上下都是PageView,当单页内的动画在初始状态和结束状态(中间)中间。是不能切换PageView的。当高度小于时,才能切换。

    2.5K30

    【Flutter】底部导航栏页面框架 ( BottomNavigationBar 底部导航栏 | PageView 滑动页面 | 底部导航与滑动页面关联操作 )

    --- PageView 作为显示的主体组件 , 设置给 Scaffold 的 body 字段 , 主要设置以下三个参数 ; 控制器 : 在 PageView 的 controller 参数设置 , PageController...= index; }); }, } PageView 被动设置选中状态 : 在 BottomNavigationBar 底部导航栏中点击导航按钮 , 切换页面 , 使用 PageView...方法 , 在此处调用 setState 方法 , 在该方法中设置 _currentIndex 的值 , 进而更新 BottomNavigationBar 底部导航栏的选中状态 ; PageView(.../docs/ Flutter 相关问题 : https://flutterchina.club/faq/ ( 入门阶段推荐看一遍 ) GitHub 上的 Flutter 开源示例 : https://download.csdn.net...动画参考文档 : https://flutterchina.club/animations/ 博客源码下载 : GitHub 地址 : https://github.com/han1202012/flutter_app

    4.6K20

    Flutter完整开发实战详解(二、 快速开发实战篇)

    上拉加载更多在代码中是通过 _getListCount() 方法,在原本的数据基础上,增加实际需要渲染的 item 数量给 ListView 实现的,最后通过 ScrollController 监听到底部...不同与 JS ,比如使用上述 Dio 网络请求返回,如果配置了返回数据格式为 json ,实际上的到会是一个Map。...大家都知道在 Flutter 中 ,是通过实现 State 与 setState 来渲染和改变 StatefulWidget 的。如果使用了flutter_redux 会有怎样的效果?  ...更多 Redux 的详细就不再展开,接下来我们讲讲 flutter_redux 的使用。在 redux 中主要引入了 action、reducer、store 概念。...Flutter 中引入 store,通过 StoreProvider 将创建 的 store 引用到 Flutter 中。

    5K30

    Flutter完整开发实战详解(二、 快速开发实战篇)

    上拉加载更多在代码中是通过 _getListCount() 方法,在原本的数据基础上,增加实际需要渲染的 item 数量给 ListView 实现的,最后通过 ScrollController 监听到底部...不同与 JS ,比如使用上述 Dio 网络请求返回,如果配置了返回数据格式为 json ,实际上的到会是一个Map。...大家都知道在 Flutter 中 ,是通过实现 State 与 setState 来渲染和改变 StatefulWidget 的。如果使用了flutter_redux 会有怎样的效果?  ...更多 Redux 的详细就不再展开,接下来我们讲讲 flutter_redux 的使用。在 redux 中主要引入了 action、reducer、store 概念。...Flutter 中引入 store,通过 StoreProvider 将创建 的 store 引用到 Flutter 中。

    5.2K10

    Flutter 动画组件那么多,记不住不会用怎么办?我都给你整理好了,收藏吧!

    这么多,好处是想用的基本都有,不好的地方是记不住,找起来也不太方便。本篇特地整理了 Flutter 的隐式动画组件,方便各位 Flutter 爱好者(搬砖者)随时查看和使用。...我们在 Flutter 入门与实战(九十三):使用 Animation 构建爱心三连动画 使用了 Animation 构建了爱心尺寸变化的动画。...我们在 Flutter 入门与实战(九十六):使用 AnimatedBuilder 分离组件和动画,实现动效复用​ 做了AnimatedBuilder的示例应用。...,可以挡住它下层的组件,使得这些组件无法与用户交互,并且在组件上加一层颜色动画过渡遮罩。...这个就很好理解了,在动画过程中更改组件透明度。我们在Flutter 入门与实战(九十五):小姐姐渐现效果 —— AnimatedOpacity 使用 已经有过介绍了。

    1.2K00

    Flutter 可以缩放拖拽的图片

    在pub上面找了下,没有发现一个效果跟微信一样的支持缩放拖拽效果的image,所以就自己撸了一个,之前写过Flutter 什么功能都有的Image,于是就在这个上面新增了这个功能。...主要功能: 缩放拖拽 在PageView里面缩放拖拽 支持缩放拖拽 ?...参数 描述 默认值 inPageView 是否使用ExtendedImageGesturePageView展示图片 false 实现过程 手势冲突 这个场景需要关注的是手势的冲突问题,PageView...最开始想的是手势应该有冒泡,是不是可以我监听到了之后,不像上冒泡,这样可以阻止PageView里面的滑动行为,最后结论是没有方法能阻止冒泡。...把ScrollableState里面关于水平垂直滚动处理的代码拿出来,我创建了一个属于extended_image专门的extended_image_gesture_page_view,属性跟PageView

    4.9K00

    Flutter 滑动删除最佳实践

    在Gmail中,我们经常会看到如下效果: ? 滑动去存档,也可以滑动删除。 那作为Google 自家出品的Flutter,当然也会有这种组件。...Dismissible 按照惯例来看一下官方文档上给出的解释: A widget that can be dismissed by dragging in the indicated direction...可以通过指示的方向来拖动消失的组件。 在DismissDirection中拖动或投掷该组件会导致该组件滑出视图。...后续我会出一篇关于 Flutter Key 的文章来详细解释一下什么是 Key。 现在我们只需要理解,key 是 widget 的唯一标示。...首先判断滑动的方向,然后根据创建的方向来创建Dialog 以及 点击事件。 最后点击时通过 Navigator.pop()来返回值。 效果如下: ?

    2.2K20

    【 Flutter 滑动探索】第四本小册上线

    ---- 现在已上架了哪些 Flutter 相关的小册? 在此之前已经发布了三本小册,分别针对 Flutter 中的 绘制 、手势 、动画 进行系统的介绍。...》 Animation 动画模块 :《Flutter 动画探索 - 流光幻影》 Flutter 滑动探索:《Flutter 滑动探索 - 珠联璧合》 ---- 还会有其他的小册上架吗?...一方面,Flutter 的版本更新是比较快的,前三本小册书写时,还未使用空安全。或者 Flutter 有些破坏性的更新,会使旧版本出现问题,从而影响小册的使用。...---- 二、为什么选择探索滑动体系 我们日常开发中接触到的关于滑动的知识只是冰山一角,很多人也只是了解 ListView 、PageView 等几个组件的使用而已,甚至连 NestScrollView...我在一开始对它们也没有很深刻的认识。 当认清 Flutter 滑动体系的构成及运作逻辑后,从源码的角度去认识这些组件的构成和用途,自然能站在更高的维度来使用它们。

    46920

    【Flutter 专题】11 底部状态栏了解下?

    和尚今天来整理一下在学习测试 Flutter 时需用到的底部导航栏 BottomNavigationBar,使用方式很简单,和尚感觉效果比原生的 Android 要好一些。...只有底部状态栏是不够的,还需要对应的中间展示内容块,可以跟 Android 的思路一样,添加几个 Page() 页作为 Fragment,和尚因为测试内容相对简单,尝试使用了 PageView,即对应...Android 中的 ViewPager,和尚会在今后的测试中详细说明,今天主要是使用基本方法展示主模块内容;如下: body: new PageView.builder( itemBuilder:...实用小贴士 通过点击 BottomNavigationBar 对 PageView 切换过程中,可以设置动画过程,也可以直接跳转到对应页面,需要设置 animateToPage 或 jumpToPage...GitHub Demo ---- 和尚刚接触 Flutter 时间不长,还有很多不清楚和不理解的地方,如果又不对的地方还希望多多指出。以下是和尚公众号,欢迎闲来吐槽~

    1.9K41

    《Flutter》-- 6.高级组件

    参阅书籍: 《Flutter跨平台开发入门与实践》-- 向治洪(著) 6. 高级组件 6.1 可滚动组件 对于列表和长布局的显示溢出问题,可以使用Flutter提供的可滚动组件来处理。...在实际使用过程中,Flutter提供了SliverList、SliverGrid等可滚动组件的Sliver版本。...6.2.2 ListView.builder 使用ListView.builder创建的列表是基于Sliver的延迟加载创建的,渲染性能比较高,适合用于列表元素比较多的情况。...PageView的构造函数: 1)PageView():默认构造函数,创建一个可滚动列表,适合子组件比较少的场景; PageView({ Key key, this.scrollDirection...6.5.2 自绘组件 在Flutter中创建自绘组件需要用到CustomPaint和CustomPainter两个类:CustomPaint在绘制阶段提供一个Canvas,即画布;CustomPainter

    10.7K20
    领券