Flutter 空安全的糖果罐,android插件化原理

  • 裁剪
  • 翻转
  • 旋转
  • 缩放
  • 色彩矩阵变化
  • 添加文字
  • 混合图片
  • 添加任意图形

editor.gif

Dialog

SmartDialog,一种更优雅的Dialog 解决方案,主要解决了系统自带的Dialog的一些问题:

  • 必须传 BuildContext。
  • 无法穿透暗色背景,点击 Dialog 后面的页面。
  • 解决系统自带 Dialog 写成的 Loading 弹窗,在网络请求和跳转页面的情况,会存在路由混乱的情况。

smartDialog

资源选择器

AssetPicker,对标微信的多选资源选择器,99%接近于原生微信的操作,主要包括以下功能:

  • ♻️ 支持基于代理重载的全量自定义
  • 💚 99% 的微信风格
  • 📷 图片资源支持
  • 🔬HEIC 格式图片支持
  • 🎥 视频资源支持
  • 🎶 音频资源支持
  • 1️⃣ 单资源模式
  • 💱 国际化支持
  • ➕ 特殊 widget 构建支持(前置/后置)
  • 🗂 自定义路径排序支持
  • 📝 自定义文本构建支持
  • ⏳ 自定义筛选规则支持( photo_manager
  • 🎏 完整的自定义主题
  • 💻 支持 MacOS
123
456
789

相机资源选择器

CameraPicker,对标微信的视频资源选择器,99%接近于原生微信的操作,主要包括以下功能:

  • 🔐 支持健全的空安全
  • 💚 99% 的微信风格
  • 📷 支持拍照
  • ☀️ 支持设置曝光参数
  • 🔍️ 支持捏合缩放
  • 🎥 支持录像
  • ⏱ 支持限制录像时间
  • 🔍 支持录像时缩放
  • 🖾 支持自定义前景 widget 构建

JsonToDart

JsonToDart,强大的 JsonToDart 工具,主要包括以下功能:

  • 空安全
  • 编辑类名,属性名
  • 去重复类
  • Merge 类属性
  • 数据数组保护
  • 属性命名规范化,只读,排序
  • 国际化
  • 全平台
  • 智能可空
平台描述地址
WindowsFlutter for Windowsgitee.com/zmtzawqlp/J…
MacosFlutter for Macosgitee.com/zmtzawqlp/J…
WebFlutter for Webzmtzawqlp.gitee.io/jsontodart/
微软商店功能未同步,以后会替换成 Flutter for UWPwww.microsoft.com/store/apps/…

JsonToDart.gif

点赞按钮

LikeButton,仿推特点赞效果,支持数字动画效果。

增量加载列表

LoadingMoreList,支持各种布局的增量加载列表,主要包括以下功能:

  • ListView
  • GridView
  • 瀑布流
  • 多个 Sliver 布局
  • 自定义加载状态 UI
  • 监控进入 Viewport 元素
  • 类聊天列表布局
  • 监控元素回收
listview.gif外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传error.gif
custom_indicator.gifnested_scrollView.gifknown_sized.gif

下拉刷新

PullToRefreshNotification,灵活的自定义下拉刷新组件,可以创造出任意的下拉刷新样式。

appbar.gifheader.gif
image.gifcandies.gif

底部扩散模糊动画

RippleBackdropAnimatePage,骚气十足的模糊动画,只需要几行代码就能帮你实现。

弹出菜单

WPopupMenu,目前最好用的仿微信聊天长按弹出框。

瀑布流

WaterfallFlow,高性能的瀑布流布局,github.com/flutter/flu…

  • 高性能
  • 易上手,跟 GridView 一样的 api
  • 可监控进入 Viewport 元素
  • 可监控元素回收
random_sized.gifcustom_scrollView.gif
known_sized.gifvariable_sized.gif

迁移

指南

感谢 Flutter & Dart 文档中国本地化 全球遮天团 为我们提供了完整准确的文档,dart.cn/null-safety…空安全 迁移大概有下面几个步骤:

  1. 执行flutter pub outdated --mode=null-safety ,检查自己项目依赖的库是否都支持空安全。

  2. 如果都支持了,执行 dart migrate --apply-changes。不加 --apply-changes 的话,会有一个浏览器地址,你打开之后,可以在浏览器中进行修改。我一般还是习惯在直接 --apply-changes 之后直接在 vscode 中进行修改。执行完毕之后,你的 Dart SDK 版本会自动改为大于2.12.0。(注意,执行 dart migrate 命令必须确保 SDK 是小于 2.12.0 的)

environment:
sdk: ‘>=2.12.0 ❤️.0.0’

  1. 工具不是万能的,会有一些 错误,请先查看完 dart.cn/null-safety 之后,根据自己的业务场景对代码进行更正。

问题

空安全对非空 List<T> 的影响是非常大的。

不能对非空的列表设置更大的长度

List 的 length getter 也有一个对应的 setter,这一点鲜为人知。您可以对列表设置一个较短的长度,从而截断它。您也可以对列表设置一个更长的长度,从而使用未初始化的元素填充它。

如果您对一个非空的列表做了这样的操作,在访问未初始化的元素时,就与空安全的健全性发生了冲突。为了防止意外发生,现在对一个非空类型的数组调用 length setter, 并且 准备设置一个更长的长度时,会在运行时抛出一个异常。您仍然可以对任何类型的列表进行截断,也可以对一个可空类型的列表进行填充。

如果您自定义了列表的类型,例如继承了 ListBase 或者混入了 ListMixin,那么这项改动可能会造成较大的影响。以上的两种类型都提供了 insert() 的实现,通过设置长度,为插入的元素提供空间。在空安全中这样做可能会出现错误,所以我们将它们的 insert() 实现改为了 add()。现在您自定义的列表应该继承 add() 方法 方法。

下面我们来跟一波可空列表在做 add 操作时候的流程,来理解下文档所说的意思。

位置
list.dartbin/cache/dart-sdk/lib/collection/list.dart
growable_array.dartbin/cache/dart-sdk/lib/_internal/vm/lib/growable_array.dart
array.dartbin/cache/dart-sdk/lib/_internal/vm/lib/array.dart
  1. ListMixin.add (dart:collection/list.dart:278)

// List interface.
void add(E element) {
// This implementation only works for lists which allow null
// as element.
this[this.length++] = element;
}

  1. List.length= (dart:core-patch/growable_array.dart:227)

void set length(int new_length) {
if (new_length > length) {
// Verify that element type is nullable.
// 官方在这里做了判断
null as T;
if (new_length > _capacity) {
_grow(new_length);
}
_setLength(new_length);
return;
}
final int new_capacity = new_length;

  1. List._grow (dart:core-patch/growable_array.dart:362)

void _grow(int new_capacity) {
// 创建了一个长度为 new_capacity 的数组,并且用 null 填充
var newData = _allocateData(new_capacity);
// This is a work-around for dartbug.com/30090: array-bound-check
// generalization causes excessive deoptimizations because it
// hoists CheckArrayBound(i, …) out of the loop below and turns it
// into CheckArrayBound(length - 1, …). Which deoptimizes
// if length == 0. However the loop itself does not execute
// if length == 0.
// 从旧列表中复制数据
if (length > 0) {
for (int i = 0; i < length; i++) {
newData[i] = this[i];
}
}
// 通知引擎替换新数据
_setData(newData);
}

  1. List._allocateData (dart:core-patch/growable_array.dart:349) 以及

_List (dart:core-patch/array.dart.dart:13)

static _List _allocateData(int capacity) {
if (capacity == 0) {
// Use shared empty list as backing.
return _emptyList;
}
// Round up size to the next odd number, since this is free
// because of alignment requirements of the GC.
// (dart:core-patch/array.dart.dart:13)
return new _List(capacity | 1);
}

  1. 通知引擎更新新数据

@pragma(“vm:recognized”, “graph-intrinsic”)
void _setData(_List array) native “GrowableList_setData”;

  1. 通知引擎更新新长度

@pragma(“vm:recognized”, “graph-intrinsic”)
void _setLength(int new_length) native “GrowableList_setLength”;

image.png

第三步中,会返回元素为 null 的列表,所以在空安全的情况下,列表操作中需要做以下改动。

  • List<int> list = List<int>(); 改为 List<int> list = <int>[];

  • List<int> list = List<int>(1); 改为 List<int> list = List<int>.filled(1, 0);

  • 如果你继承了 ListBase 或者混入了 ListMixin,你需要重写 add() 方法,否则在第二步中就会报错。完整代码

@override
void add(T element) {
_array.add(element);
}

建议

坐和放宽

对于每次的大版本更新,不要着急升级,特别是你的项目引用了三方组件。三方开源作者是不大可能有时间立刻就更新,订阅一下作者的更新计划,静静等待。一般 stable 版本发布之后都会有热修复版本。如果你是新手,请坐和放宽,静待大佬们发现和解决点一些重大问题之后再更新。

image.png

学会使用 pub.dev

空安全的组件有很明显的标志 Null safety。打开 Versions 一签,通过 Min Dart SDK 很容易就看出组件是从哪个版本开始支持空安全的,比如 extended_image3.0.0 版本支持空安全。

image.png

另外,有些组件还提供了 Prerelease versions。比如 extended_image 还提供了非空安全版本. 当然 Prerelease versions 也可能是预览版,修复紧急问题(一些用户使用 Flutter master/dev/beta 分支,该分支可能会有一些 apibreaking change),作者会发布预览版来满足这部分人群。

image.png

每个人都从萌新而来,爱护萌新,但也不应该纵容巨婴。

  1. flutter.cn/dart.cn/ ,从入门到深入,各种资源应有尽有。如果你准备入手 Flutter,这应该是你必看的网站。

截屏2021-04-10 下午2.57.54.png

  1. github.com/flutter/flu… ,当遇到一些奇怪问题的时候,可以尝试搜索官方, 也许地球上某个地方的我也遇到了相同的问题。如果没搜到,并且确定是官方的问题,请不要吝啬你的时间,提交一个 issue ,让官方知晓,为其他人节约时间,提供思路。不要担心你的英文水平,只有多写,多练习,才能更好。

  2. www.google.comstackoverflow.com 程序猿都应该知道和会使用。

  3. juejin.cn 应该算是国内 Flutter 文章最多的一个网站了,对于英文不好的小伙伴,有中文的各种各样的 Flutter 相关文章也是极好的。

  4. qq群:181398081,如果通过上面的方式,你还是没法解决问题,你可以在 qq群 里面提问,很荣幸群里有一群热心的群友,互相帮助,互相学习。

  5. 最后,不管在哪里提问,尽量上代码,或者阐明清楚意图,因为也许想法或者解决方向从开始就是不正确的。

结语

2岁的糖果
不知不觉,糖果 已经 2岁 了,Flutter2.0 了。感谢 糖果 的小伙伴,对开源组件的持续支持。从 Flutter Candies 一桶天下 到现在又一年了,组织也在不断地壮大。欢迎更多的小伙伴都加入进来,一起为 Flutter 社区添砖加瓦。
截屏2021-04-09 下午5.58.22.png

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

总结

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

上述【高清技术脑图】以及【配套的面试真题PDF】可以点击我的GitHub免费获取

本文在开源项目:[https://github.com]中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

img-4TXzNYfJ-1710659097817)]

上述【高清技术脑图】以及【配套的面试真题PDF】可以点击我的GitHub免费获取

本文在开源项目:[https://github.com]中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值