Flutter添加购物车效果实现

trimVideo_2019-12-16_19_51_24.gif

1. 要实现先要了解的知识 :

(0)flutter 常用组件的使用

(1)flutter 动画

(2) flutter 控件位置及大小如何获取

动画:

这里只随口一说里边用到的, 详细的flutter动画介绍后面会再整理。

(1)AnimationController: 动画的控制: 控制动画的开始,介绍,时长等。

(2)Animation: 动画, 可设置监听动画的状态变化监听。 通过 animation.value 来获取动画的值。

控件位置及大小的获取:

一句话--> 通过 BuildContext , 能拿到BuildContext就可以拿到控件相关的位置、大小等信息。

至于一个小组件的context 如果取? 一般我了解的有2种,

a. 一个是提取一个小组件为自定义widget,build里边的context即是我们所需要的。

b. 另外一个相对简单的就是直接通过 GlobalKey 的 .currentContext 来拿到。

key.currentContext的方式:

RenderBox renderBox = spKey.currentContext.findRenderObject();

// 这个就是控件的大小 size.width, size.height

Size size = renderBox.size;

// offset 就是坐标相关的 offset.dx, offset.dy

Offset offset = renderBox.localToGlobal(Offset(renderBox.size.width * 0.5, renderBox.size.height * 0.5)); // 转化为全局左边, 这样更容易我们后边的处理。

通过提取Widget的方式:

相对于上边的3行代码, 就第一行不一样,RenderBox renderBox = context.findRenderObject(); // context 就是widget 中的BuildContext。

2. 思路

效果是 从点击的位置 在一小段时间内 将一个图片or红点or XXX 以一个曲线的方式移动到购物车中,来给人更真实的 “鸡蛋放到框里”的感觉。

我们知道这个移动的红点(这里就用红点了,你可以移动任何东西)移动的过程中是要跨越很多其他widget的,比如从列表第一个移动跨越整个列表到列表右下角悬浮的一个“购物车” , 或者更复杂点的,要移动到下边主菜单(Tabbar)中的购物车。所以, 我们完成移动的画布就需要是 “屏幕级”的了。 那我们就用 Stack ,用Stack在原有的页面上叠加一个用户看不到的“页面”, 我们的效果动画就在这个叠加的Widget上去完成。

动画的实现: (1)获取点击的按钮的位置a, (2)获取“购物车”的位置b 这样我们要做的工作就变成了, 将一个红点按动画的方式 从位置a移动到位置b, 这样问题就简单了 。 a --> b

3. 实现(主要代码)

(1)商品列表加入购物车主要代码的实现

Stack(

children: <Widget>[

Container(

child: ListView(

children: goodsList.map((item) {

return GoodsItem(

item: item,

addToShoppingCart: (o) {

count++;

setState(() {

goodsOffset = o;

});

},

);

}).toList()),

),

// 这个就是我们要做动画移动的“浮层”页面

AddAnimationContainer(

startOffset: goodsOffset, // 点击的商品位置

endOffset: spOffset, // 购物车位置

topHeight: topHeight, // 这个看实际情况,这里是顶部appBar的高度,我们做动画的时候计算用的 (全局坐标- 这个)

),

],

),

(2)移动动画实现

double top = 0; // 要移动的红点距离顶部的距离

double left = 0; // 要移动的红点距离左边的距离

AnimationController _controller;

Animation _animation;

@override

void initState() {

super.initState();

_controller =

AnimationController(duration: Duration(milliseconds: 800), vsync: this);

_animation = Tween(begin: 0, end: 1.0).animate(_controller)

..addListener(() {

setState(() {});

})

..addStatusListener((AnimationStatus status) { // 动画状态的监听

if (status == AnimationStatus.completed) { // 动画完成以后 通知上层回调

if (widget.onEnd != null) {

widget.onEnd(this.widget);

}

}

});

WidgetsBinding.instance.addPostFrameCallback((_) { // 这个回调是在组件绘制完成后第一个调用的,且只调用一次, 这里做开启动画的动作

_controller.forward();

});

}

@override

void dispose() {

// 一定不要忘记做 销毁 释放

_controller.dispose();

_animation = null;

_controller = null;

super.dispose();

}

@override

Widget build(BuildContext context) {

// 1\. 开始的坐标信息

var startX = widget.startOffset.dx;

var startY = widget.startOffset.dy;

// 2\. 结束点的坐标信息

var endX = widget.endOffset.dx;

var endY = widget.endOffset.dy;

// 3\. 动画值变化过程中计算 红点的 实时位置

var x = startX + (endX - startX) * _animation.value;

var y = startY + (endY - startY) * _animation.value;

// 4\. 根据实时位置来确定组件的实际位置

top = y;

left = x;

return Container(

child: Positioned(

top: top - widget.topHeight,

left: left,

child: Icon( // 这 就是 所说的要移动的 “红点” 组件,,,可以任意定义

Icons.arrow_drop_down_circle,

color: Colors.red,

size: 18,

),

),

);

}

4. 全部代码

下载地址一:
https://download.csdn.net/download/chwei_cson/12032825
下载地址二:
https://github.com/chweiGitHub/flutter_demo.git

5. 这只是学习笔记,有错误欢迎指出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345