50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

RTC Dev Meetup:Flutter 开发实战与前景展望(三)

  • 2019-11-30
  • 本文字数:1575 字

    阅读完需:约 5 分钟

RTC Dev Meetup:Flutter 开发实战与前景展望(三)

4、手势

Flutter 在手势中引入了竞技的概念, Down 事件在 Flutter 中尤为重要。



  • PointerDownEvent 是一切的起源,在 Down 事件中一般不会决出胜利者。

  • 在 MOVE 和 UP 的时候才竞争得到响应。

  • 以点击为例子: Down 时添加进去参与竞争, UP 的时候才决定谁胜利,胜利条件是:


I、 UP 的时候如果只有一个,那么就是它了。


II、 UP 的时候如果有多个,那么强制队列里第一个直接胜利。


  • 这里包含了有趣的点就是,都在 UP 的时候才响应,那么 Down 事件怎么先传递出去了?


FLutter 在这里做了一个 didExceedDeadline 机制 ,事实上在上面的 addPointer 的时候,会启动了一个定时器,默认 100 ms,如果超过指定时间没 UP ,那就先执行这个 didExceedDeadline 响应 Down 事件。


  • 那问题又来了,如果这时候队列里两个呢?


它们的 onTapDown 都会被触发,但是 onTap 只有一个获得。


  • 如果有两个滑动 ScrollView 嵌套呢?


举个简单的例子,两个 SingleChildScrollView 的嵌套时,在布局会经历:


performLayout -> applyContentDimensions -> applyNewDimensions -> context.setCanDrag(physics.shouldAcceptUserOffset(this));


只有 shouldAcceptUserOffset 为 ture 时,才会添加 VerticalDragGestureRecognizer 去处理手势。


而判断条件主要是 returnmath.max(0.0,child.size.height-size.height); ,也就是如果 child Scroll 的 height 小于父控件 Scroll 的时候,就会出现 child 不添加 VerticalDragGestureRecognizer 的情况,这时候根本就没有竞争了。

5、动画

Flutter 中的动画是怎么执行的呢?


我们先看一段代码,然后这段代码执行的效果如下图 2 所示。


那既然 Widget 都是一帧,那么动画肯定有 setState 的地方了。


首先这里有个地方可以看下,这时候 200 这个数值执行后是会报错的,因为白框内可见 Tween 中的 T 在这时候会出现既有 int 又有 double ,无法判断的问题,所以真实应该是 200.0 。




同时你发现没有,代码中 parent 的 Container 在 只有 100 的情况下,它的 child 可以正常的画 200,这是因为我们的 paint 没有跟着 RenerObjcet 的大小走, 所以一般情况下,整个屏幕都是我们的画版,Canvas 绘制与父控件大小可以没关系。


同时动画是通过 vsync 同步信号去触发的,就是我们 mixin 的 SingleTickerProviderStateMixin,它内部的 Ticker 会通过 SchedulerBinding 的 scheduleFrameCallback 同步信号触发重绘 。


动画后的控件的点击区域,和你的动画数据改变的是 paint 还是 layout 有关 。

6、状态管理

scope_model 、 flutter_redux、 fish_redux 、甚至还有有 dva_flutter 等等,可以看出状态管理在 flutter 中和前端十分相近。


这里简单说说 scope_model ,它只有一个文件,但是很巧妙,它利用的就是 AnimationBuilder 的特性。


如下图是使用代码,在前面我们知道,状态管理使用的是 InheritedWidget 实现共享的,而当我们对 Model 进行数据改变时,通过调用 notifyListeners 通知页面更新了。



这里的原理是什么呢?


  • 其实 scope_model 内部利用了 AnimationBuilder ,而 Model 实现了 Listenable 接口。

  • 当 Model 设置给了 AnimationBuilder 时, AnimationBuilder 会执行 addListener 添加监听,而监听方法里会执行 setState。

  • 所以我们改变 set 方法时调用 notifyListeners 就触发了 setState 去更新了,这样体现出了前面说的 FLutter 常见的开发模式。


三、混合开发

以 Android 的角度来说,从方便调试和解耦集成上,我们一般会以 aar 的形式集成混合开发,这里就会涉及到 gradle 打包的一个概念。


1、如下代码所示,在项目中进行 gradle 脚本修改,组件化开发模式,用 apk 开发,用 aar 提供集成,正常修改 gradle 代码即可快速打包。



那如果 Flutter 的项目插件带有本地代码呢?


如果开发过 ReactNative 的应该知道,在原生插件安装时会需要执行 react-nativelink ,而这时候会修改项目的 gradle 和 java 代码。


2019-11-30 16:53903

评论

发布
暂无评论
发现更多内容

Java开发者LLM实战——使用LangChain4j构建本地RAG系统

京东科技开发者

AE红巨人特效合成插件:Red Giant VFX Suite Mac/win 激活版

你的猪会飞吗

AE插件 AE粒子特效插件

服务端性能测试:行业流行性能压测工具介绍

测试人

软件测试

Redis可视化工具Redis Desktop Manager mac中文直装版下载安装

Rose

Memory Clean 3 for Mac 苹果电脑内存清理工具

Rose

office 365 for mac破解版附激活工具

Rose

LED透明屏:新时代的视觉革命与技术突破

Dylan

广告 科技 LED display LED显示屏 市场

Paragon NTFS Mac终身激活版(mac读写ntfs磁盘软件)

Rose

3个企业级最佳实践,教你ByteHouse云数仓这么用

字节跳动数据平台

数据库 大数据 云原生 Clickhouse 数仓

数据资产的价值变现及管理规划(AMT企源)

AMT企源

数据资产 数据管理 数据要素

Datadog Dash 2024 新功能解析

观测云

可观测性

万字长文浅谈系统稳定性建设

京东科技开发者

知乎AI产品“直答”正式上线!文心一言4.0 Turbo来袭,可为农民提供专业指导!|AI日报

可信AI进展

人工智能

Illustrator 2024中文激活版 ai2024下载安装教程 附破解工具

Rose

2023年央企安全威胁盘点

芯盾时代

身份安全 国企 央企

XMind 2024绿色破解版下载 好用的思维导图软件

Rose

Quick BI站稳Gartner ABI挑战者象限,打造“人人能用的BI”

ToB行业头条

FL Studio怎么提取伴奏 FL Studio怎么给伴奏升降调 flstudio教程

阿拉灯神丁

编曲宿主 编曲软件 水果FL Studio FL Studio 21 音乐软件

什么是圈子论坛系统,圈子论坛系统具备哪些基本功能,社交圈系统

DUOKE七七

【永久激活版】Topaz Mask AI for mac 人工智能AI抠图

Rose

【HDC.2024】云原生中间件,构筑软件安全可信的连接桥梁

云计算 云原生 软件开发 华为云

智能商品计划系统:品牌商不可或缺的利器

第七在线

如何打造开放领先的可观测性数据底座

乘云数字DataBuff

探索哈希函数:数据完整性的守护者

天津汇柏科技有限公司

哈希函数

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac中文破解资源

Rose

spark运行的基本流程

京东科技开发者

专业HDR渲染软件Topaz Adjust AI下载安装 附topaz adjust ai破解工具

Rose

CQ 社区版2.13.3 | 支持全局开启OTP登录、文本导入功能可独立控制……

BinTools图尔兹

访问控制 数据库管控 CloudQuery OTP令牌 #SQL

Parallels Desktop 17(pd虚拟机)+懒人小白win系统直装包

Rose

Photoshop 2023 (PS 2023下载) v24.7中/英文激活版

Rose

RTC Dev Meetup:Flutter 开发实战与前景展望(三)_文化 & 方法_声网_InfoQ精选文章