技术分享

谈谈 Flutter 的页面

一般来说,flutter 的页面都是由 Navigator 这个组件来组织的,一个页面对应一个 Route<T>。不过我看到许多业务方同学对于这个页面的理解有些偏差,比如以下几个问题: 1. PageRoute<T> 的 build 函数是否会多次执行?(比如常用的 MaterialPageRoute<T> 里面的 build 函数) 2. 当 push 了一个新的页面的时候,不在栈顶的页面根 widget 是否会重新执行 build 函数? 3. 非栈顶页面是否会渲染? 4. 非栈顶页面的 state 是否会保存?
谈谈 Flutter 的页面

谈谈 Flutter 的 build

flutter 中的 build(context) 算是我们开发 flutter 接触最多的一个函数,不管是大到页面,还是小到一个文本,都需要通过 build(context) 来构建,所以这个 build 函数的调用将会非常频繁。 所以对我们开发者来说,熟悉 build 函数的调用时机,了解某个操作会让哪些 widget 执行 build 是非常重要的。当然这不是一个立马可以学会的东西,因为不同组件的行为可能不一样,不过底层的原理都是相同的。 读完本文后,你将对 flutter 的 build、diff 复用机制 有个全局性的掌握,文章有点长,可以先收藏了慢慢看。
谈谈 Flutter 的 build
Flutter 手势事件解析(二)

一种无入侵的Flutter混合栈方案

Flutter 是一个跨平台开发的工具,它极速的开发方式、Native 的表现性能、开源的代码等特点吸引了业界众多开发者的注意。不过由于 Flutter 处于萌芽发展阶段,还不是很完善,比如本文需要探讨的混合栈实现就是 Flutter 其中的一块短板,目前没有一套官方的解决方案,都是业界开发者在试水 这里简单介绍下 Flutter 的混合栈问题:Flutter 的界面是需要 Native 的容器来承载显示的,比如 Android 里面的 Activity,iOS 里面的 ViewController。现有的 app 不可能全部改成 flutter 实现,所以需要将 flutter 接入现有的 app 中,如果此时从 Native 页面跳转到 Flutter 页面,默认的方式会重新初始化一个 Flutter 实例运行,不会复用之前创建的 Flutter 实例 > 具体细节在之前的一篇混合栈文章 Flutter混合栈管理 里面讲述了 我之前开发过一个混合栈插件来解决 flutter 的混合开发问题,最后在使用的时候会碰到以下问题: * Flutter 的共享动画会失效 (Hero 动画) * 必须使用混合栈的 api 来打开跳转页面,无法使用系统的 Navigator 为了解决上述问题,需要重新设计 Flutter 混合栈插件,下面来探讨下怎么解决上述两个问题
一种无入侵的Flutter混合栈方案

Android 插件化的版本一致性问题

Android 的插件化开发,这个坑非常深,其中有一个问题就是 bundle 和 host 的版本不一致性问题,如果 bundle 中 sdk 的版本和 host 中 sdk 版本不一致,就很有可能出现 api 兼容性问题,导致运行时 crash。 一开始会想:"让 host 和 bundle 中的版本号抽离成一个文件不就行了?" 答案肯定是不行,因为这样只能让直接依赖的版本一致,不能让传递依赖的版本一致化
Android 插件化的版本一致性问题

Flutter混合栈管理

Flutter 是谷歌开发的一款可以跨平台开发的 UI 框架,它的原理接近于游戏引擎,目的在于统一 Android/iOS 两端开发,Flutter 页面有自己的栈,正常情况下,如果一个 app 完全由 Flutter 构成,那么只需要一个 FlutterView 即可。 上述方案只适用于一些新构建的 app,对于一些已有的 app,是不可能用 flutter 来重构的,成本太大,周期太长,所以这里需要实现一套 Native 页面栈和 Flutter 页面栈的管理方案,混合栈。
Flutter混合栈管理

Flutter入门介绍

对于开发者而言,Flutter 是什么?他是用什么语言编写的?包含那几部分?是如何运行到设备上的?Flutter 工程和 Native 工程有何差别?支持热跟新吗?Flutter 界面是如何构建的... 这里对 Flutter 做一个大致方向的介绍,让你开始了解它
Flutter入门介绍

探索阻尼动画优雅的实现方式

本文探讨下如何在 Android 上实现阻尼动画,首先 wiki 下阻尼的定义:是指任何振动系统在振动中,由于外界作用(如流体阻力、摩擦力等)和/或系统本身固有的原因引起的振动幅度逐渐下降的特性,也就是阻尼系统由两个子系统组成(振子系统、阻力系统),先前写过一篇 {% post_link 如何优雅地在Android上实现iOS的图片预览 如何优雅地在Android上实现iOS的图片预览 %} ,就是一套阻尼动画的实现
探索阻尼动画优雅的实现方式

探索 Android RippleDrawable作为背景是如何绘制到View外的

某天某时某刻,脑内突然发现一个疑问:RippleDrawable 是怎么把波纹绘制到所在 View 外面的? 稍微了解点 Android 绘制知识的就知道,子 View 的 onDraw(canvas) 获取到的画布默认是被父亲裁剪掉的,导致子 View 无法绘制到自身外面 那么问题就来了,为毛 RippleDrawable 可以绘制到外面,用了什么原理?莫非有特权?
探索 Android RippleDrawable作为背景是如何绘制到View外的

在Android上使用FFmpeg压缩视频

前几天项目需要压缩视频,Github上找了许多库,要么就是太大,要么就是质量不高,其实我只需要压缩视频,最好的方案还是定制编译一个 FFmpeg 给 Android 用。 > 本项目使用 FFmpeg 和 libx264(一个第三方的视频编码器) 来编译出可以在 Android 上使用的动态库
在Android上使用FFmpeg压缩视频