写点什么

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:53783

评论

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

350道Android面试真题分享,大厂直通车!

欢喜学安卓

android 程序员 面试 移动开发

【LeetCode】前K个高频单词Java题解

Albert

算法 LeetCode 5月日更

初探图像二值化

CagyJ

算法 CV OpenCV 图像处理

Python 多线程 VS 多进程(二)

若尘

多线程 多进程 Python编程 5月日更

Go sync.Pool 浅析

HHFCodeRv

Go 语言

520单身福利|女朋友又找我要礼物

孙叫兽

程序员 520单身福利 520 单身福利

学习笔记之:知识地图

Nydia

学习

低代码“骗局”

ES_her0

5月日更

网络攻防学习笔记 Day20

穿过生命散发芬芳

5月日更 网络攻防

MemVerge认为PB级内存池将随CXL而来

Steven Xu

内存 存储 高性能服务器

华云大咖说 | 华云超融合在论文期刊行业的应用实践

华云数据

Hibernate的get和load区别学习笔记

风翱

hibernate 5月日更

写给丫头

小天同学

情人节 5月日更 520单身福利 情书 告白

CEO观点 | 核心开放:企业拥抱开源的成功之道

极狐GitLab

开源 DevOps 安全 高效 协同办公

520特辑丨码神VS爱神:盘点程序员的四大男友力,你偏爱哪一种?

华为云开发者联盟

程序员 代码 520 男朋友 男友力

网易云课堂 Service Worker 运用与实践

有道技术团队

Service Worker

Flutter开发:Warning:CocoaPods minimum required version 1.6.0 or greater not installed…的解决方法

三掌柜

5月日更

一文掌握 Java8 的 Optional 的 6 种操作

看山

Java

区块链与资产数字化

CECBC

网络攻防学习笔记 Day19

穿过生命散发芬芳

5月日更 网络攻防

Dubbo 并发控制

青年IT男

dubbo

北京市级预付费资金监管平台正式上线试运行 内嵌区块链存证技术

CECBC

Rust从0到1-错误处理-Result

rust Error 可恢复错误 result

《Spring 手撸专栏》第 2 章:小试牛刀(让新手能懂),实现一个简单的Bean容器

小傅哥

Java spring 容器 小傅哥 hashmap

人工智能基础2 - DAY10

Qien Z.

人工智能 基础 5月日更

数据挖掘从入门到放弃(六):K-means 聚类

数据社

机器学习 5月日更

211本硕如何通过字节跳动、百度、美团Android面试?复习指南

欢喜学安卓

android 程序员 面试 移动开发

有了这三个神器工具集,应用开发想怎么玩就怎么玩

华为云开发者联盟

开发者 华为云 应用开发 工具集 APIExplorer

Nginx高并发调优中常被忽略的参数

运维研习社

nginx 运维 并发 性能调优 5月日更

Node.js学习 —— 简介

空城机

JavaScript 大前端 Node 5月日更

TOB产品需求调研

lenka

5月日更

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