- 裁剪
- 翻转
- 旋转
- 缩放
- 色彩矩阵变化
- 添加文字
- 混合图片
- 添加任意图形
![editor.gif](https://img-
blog.csdnimg.cn/img_convert/d64a95f1bc246c2156ab96a0dfb3e104.gif)
Dialog
SmartDialog,一种更优雅的Dialog 解决方案,主要解决了系统自带的Dialog的一些问题:
- 必须传 BuildContext。
- 无法穿透暗色背景,点击 Dialog 后面的页面。
- 解决系统自带 Dialog 写成的 Loading 弹窗,在网络请求和跳转页面的情况,会存在路由混乱的情况。
![smartDialog](https://img-
blog.csdnimg.cn/img_convert/abea9719a2a88724f6a5c82d4913a08d.gif)
资源选择器
AssetPicker,对标微信的多选资源选择器,99%接近于原生微信的操作,主要包括以下功能:
- ♻️ 支持基于代理重载的全量自定义
- 💚 99% 的微信风格
- 📷 图片资源支持
- 🔬HEIC 格式图片支持
- 🎥 视频资源支持
- 🎶 音频资源支持
- 1️⃣ 单资源模式
- 💱 国际化支持
- ➕ 特殊 widget 构建支持(前置/后置)
- 🗂 自定义路径排序支持
- 📝 自定义文本构建支持
- ⏳ 自定义筛选规则支持(
photo_manager
) - 🎏 完整的自定义主题
- 💻 支持 MacOS
![1](https://img-
blog.csdnimg.cn/img_convert/a5b06cabc6e4740c4fb83326cd4cd5bd.jpeg)|
![2](https://img-
blog.csdnimg.cn/img_convert/772fc90c50c7cf98d1e75c4956d900b3.jpeg)|
![3](https://img-
blog.csdnimg.cn/img_convert/f149e8764e25b63360d3dd941813aa63.jpeg)
—|—|—
![4](https://img-
blog.csdnimg.cn/img_convert/bc9fba74d38d846b5fcf6e825b186b5d.jpeg)|
![5](https://img-
blog.csdnimg.cn/img_convert/c9794ea24ab270b907054863982ee186.jpeg)|
![6](https://img-
blog.csdnimg.cn/img_convert/d276f310895efd78f84e458344d9f175.jpeg)
![7](https://img-
blog.csdnimg.cn/img_convert/becf4063f80a5d2daa327fe181afb0dd.jpeg)|
![8](https://img-
blog.csdnimg.cn/img_convert/4802f9d4f87f9bfb3810e36ee4ea1bfc.jpeg)|
![9](https://img-
blog.csdnimg.cn/img_convert/b6c0593b245a66ee3af4cc571846b471.jpeg)
相机资源选择器
CameraPicker,对标微信的视频资源选择器,99%接近于原生微信的操作,主要包括以下功能:
- 🔐 支持健全的空安全
- 💚 99% 的微信风格
- 📷 支持拍照
- ☀️ 支持设置曝光参数
- 🔍️ 支持捏合缩放
- 🎥 支持录像
- ⏱ 支持限制录像时间
- 🔍 支持录像时缩放
- 🖾 支持自定义前景 widget 构建
![](https://img-
blog.csdnimg.cn/img_convert/b079f841587c6a399f9227d6f135a5bb.jpeg)|
![](https://img-
blog.csdnimg.cn/img_convert/4c9cc8eb2e7c61615fd8d98ebb542269.jpeg)
—|—
![](https://img-
blog.csdnimg.cn/img_convert/2842bc1106b5919395adfca7f25cfac5.jpeg)|
![](https://img-
blog.csdnimg.cn/img_convert/f7b81aed1205bd1c8e1a9b6822a75215.jpeg)
JsonToDart
JsonToDart,强大的 JsonToDart
工具,主要包括以下功能:
- 空安全
- 编辑类名,属性名
- 去重复类
- Merge 类属性
- 数据数组保护
- 属性命名规范化,只读,排序
- 国际化
- 全平台
- 智能可空
平台 | 描述 | 地址 |
---|---|---|
Windows | Flutter for Windows | gitee.com/zmtzawqlp/J… |
Macos | Flutter for Macos | gitee.com/zmtzawqlp/J… |
Web | Flutter for Web | zmtzawqlp.gitee.io/jsontodart/ |
微软商店 | 功能未同步,以后会替换成 Flutter for UWP | www.microsoft.com/store/apps/… |
![JsonToDart.gif](https://img-
blog.csdnimg.cn/img_convert/3cac8650b444e5a3c73fe8c5e339cbbf.gif)
点赞按钮
LikeButton,仿推特点赞效果,支持数字动画效果。
![](https://img-
blog.csdnimg.cn/img_convert/ca7c3efd0ec3a7b89b662b3fc1c2f300.gif)
增量加载列表
LoadingMoreList,支持各种布局的增量加载列表,主要包括以下功能:
- ListView
- GridView
- 瀑布流
- 多个 Sliver 布局
- 自定义加载状态 UI
- 监控进入
Viewport
元素 - 类聊天列表布局
- 监控元素回收
| |
—|—|—
![listview.gif](https://img-
blog.csdnimg.cn/img_convert/4047886a9e88d750e6a75cbb58f393c6.gif)|
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-
home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fp6-juejin.byteimg.com%2Ftos-
cn-i-k3u1fbpfcp%2Fdbc82adebf3748958dee472112c92dc0~tplv-k3u1fbpfcp-
watermark.image&pos_id=img-CPmCeFFd-1710659098233)| ![error.gif](https://img-
blog.csdnimg.cn/img_convert/47c9ccc200efc6ce50f0b5b1cd888241.gif)
![custom_indicator.gif](https://img-
blog.csdnimg.cn/img_convert/091079a6f51e13e61b102c72f234c720.gif)|
![nested_scrollView.gif](https://img-
blog.csdnimg.cn/img_convert/1153ed343de5d509043ee608f87c3ff6.gif)|
![known_sized.gif](https://img-
blog.csdnimg.cn/img_convert/8a074572fa2e3504f428ff87102137fd.gif)
下拉刷新
PullToRefreshNotification,灵活的自定义下拉刷新组件,可以创造出任意的下拉刷新样式。
|
—|—
![appbar.gif](https://img-
blog.csdnimg.cn/img_convert/22b84fb126ae459327cf10181db87988.gif)|
![header.gif](https://img-
blog.csdnimg.cn/img_convert/096b73e1a336ec02c7b4351cdfe2c9de.gif)
|
![image.gif](https://img-
blog.csdnimg.cn/img_convert/cff2c966dc958c369248d536b277dc0e.gif)|
![candies.gif](https://img-
blog.csdnimg.cn/img_convert/7222309107863dd0e4a58902ebe720a8.gif)
底部扩散模糊动画
RippleBackdropAnimatePage,骚气十足的模糊动画,只需要几行代码就能帮你实现。
![](https://img-
blog.csdnimg.cn/img_convert/364ec60e47658f258101c8f766b1c9cc.gif)
弹出菜单
WPopupMenu,目前最好用的仿微信聊天长按弹出框。
![](https://img-
blog.csdnimg.cn/img_convert/95d02ba4fc5ec70ee094ce2e3660315e.gif)
瀑布流
WaterfallFlow,高性能的瀑布流布局,github.com/flutter/flu… 。
- 高性能
- 易上手,跟
GridView
一样的api
- 可监控进入
Viewport
元素 - 可监控元素回收
|
—|—
![random_sized.gif](https://img-
blog.csdnimg.cn/img_convert/b887b79737956a6e708655f29ce8ef2a.gif)|
![custom_scrollView.gif](https://img-
blog.csdnimg.cn/img_convert/b39d750a5de2dada30a05fa126a4f3f7.gif)
![known_sized.gif](https://img-
blog.csdnimg.cn/img_convert/e6ad6b899b13e2132add7b9c3027e6d6.gif)|
![variable_sized.gif](https://img-
blog.csdnimg.cn/img_convert/d2e9390db992de2885aa56b65dbfdbe3.gif)
迁移
指南
感谢 Flutter & Dart
文档中国本地化 全球遮天团
为我们提供了完整准确的文档,dart.cn/null-safety…
,空安全
迁移大概有下面几个步骤:
-
执行
flutter pub outdated --mode=null-safety
,检查自己项目依赖的库是否都支持空安全。 -
如果都支持了,执行
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’
- 工具不是万能的,会有一些
错误
,请先查看完 dart.cn/null-safety 之后,根据自己的业务场景对代码进行更正。
问题
空安全对非空
List<T>
的影响是非常大的。
不能对非空的列表设置更大的长度
List 的 length getter 也有一个对应的
setter,这一点鲜为人知。您可以对列表设置一个较短的长度,从而截断它。您也可以对列表设置一个更长的长度,从而使用未初始化的元素填充它。如果您对一个非空的列表做了这样的操作,在访问未初始化的元素时,就与空安全的健全性发生了冲突。为了防止意外发生,现在对一个非空类型的数组调用 length
setter, 并且 准备设置一个更长的长度时,会在运行时抛出一个异常。您仍然可以对任何类型的列表进行截断,也可以对一个可空类型的列表进行填充。如果您自定义了列表的类型,例如继承了 ListBase 或者混入了 ListMixin,那么这项改动可能会造成较大的影响。以上的两种类型都提供了
insert() 的实现,通过设置长度,为插入的元素提供空间。在空安全中这样做可能会出现错误,所以我们将它们的 insert() 实现改为了
add()。现在您自定义的列表应该继承 add() 方法 方法。
下面我们来跟一波可空
列表在做 add
操作时候的流程,来理解下文档所说的意思。
类 | 位置 |
---|---|
list.dart | bin/cache/dart-sdk/lib/collection/list.dart |
growable_array.dart | `bin/cache/dart- |
sdk/lib/_internal/vm/lib/growable_array.dart` | |
array.dart | bin/cache/dart-sdk/lib/_internal/vm/lib/array.dart |
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;
}
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;
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);
}
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);
}
- 通知引擎更新新数据
@pragma(“vm:recognized”, “graph-intrinsic”)
void _setData(_List array) native “GrowableList_setData”;
- 通知引擎更新新长度
@pragma(“vm:recognized”, “graph-intrinsic”)
void _setLength(int new_length) native “GrowableList_setLength”;
![image.png](https://img-
blog.csdnimg.cn/img_convert/d4f5ea7a227658a9c32cf4badf5914be.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](https://img-
blog.csdnimg.cn/img_convert/23fe0a2b79c40cf935e0fcb06a8520d0.png)
学会使用 pub.dev
空安全的组件有很明显的标志 Null safety
。打开 Versions
一签,通过 Min Dart SDK
很容易就看出组件是从哪个版本开始支持空安全的,比如 extended_image
从 3.0.0
版本支持空安全。
![image.png](https://img-
blog.csdnimg.cn/img_convert/0dac94dbb52d89b0bbdaeaf4633ebe08.png)
另外,有些组件还提供了 Prerelease versions
。比如 extended_image
还提供了非空安全版本. 当然
Prerelease versions
也可能是预览版,修复紧急问题(一些用户使用 Flutter master/dev/beta
分支,该分支可能会有一些 api
的 breaking change
),作者会发布预览版来满足这部分人群。
![image.png](https://img-
blog.csdnimg.cn/img_convert/406063e64a4d305a803b829c14a09f7a.png)
每个人都从萌新而来,爱护萌新,但也不应该纵容巨婴。
- flutter.cn/ 和 dart.cn/ ,从入门到深入,各种资源应有尽有。如果你准备入手
Flutter
,这应该是你必看的网站。
![截屏2021-04-10 下午2.57.54.png](https://img-
blog.csdnimg.cn/img_convert/12c198139f6896f99058939c25a29feb.png)
-
github.com/flutter/flu… ,当遇到一些奇怪问题的时候,可以尝试搜索官方, 也许地球上某个地方的我也遇到了相同的问题。如果没搜到,并且确定是官方的问题,请不要吝啬你的时间,提交一个
issue
,让官方知晓,为其他人节约时间,提供思路。不要担心你的英文水平,只有多写,多练习,才能更好。 -
www.google.com 和 stackoverflow.com 程序猿都应该知道和会使用。
-
juejin.cn 应该算是国内
Flutter
文章最多的一个网站了,对于英文不好的小伙伴,有中文的各种各样的Flutter
相关文章也是极好的。 -
qq群:181398081,如果通过上面的方式,你还是没法解决问题,你可以在
qq群
里面提问,很荣幸群里有一群热心的群友,互相帮助,互相学习。 -
最后,不管在哪里提问,尽量上代码,或者阐明清楚意图,因为也许想法或者解决方向从开始就是不正确的。
![](https://img-
blog.csdnimg.cn/img_convert/b710ad66716897b90100ea6e464fea12.jpeg)
结语
2岁的糖果
不知不觉,糖果
已经2岁
了,Flutter
也2.0
了。感谢糖果
的小伙伴,对开源组件的持续支持。从 Flutter
Candies 一桶天下 到现在又一年了,组织也在不断地壮大。欢迎更多的小伙伴都加入进来,一起为Flutter
社区添砖加瓦。
![截屏2021-04-09 下午5.58.22.png](https://img-
blog.csdnimg.cn/img_convert/8f837eeb66472a6c6eadcbe25a6f0523.png)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
![img](https://img-
blog.csdnimg.cn/img_convert/3c8b3b7cd43e2c905718f0929d4a1086.png)
![img](https://img-
blog.csdnimg.cn/img_convert/80584535e9145f957efa4a5166d32a91.png)
![img](https://img-
blog.csdnimg.cn/img_convert/fc6ac768427ba54df3d0414439c946b0.png)
![img](https://img-
blog.csdnimg.cn/img_convert/ff31eb8f10c5a15908ce523e073569a2.png)
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
![img](https://img-
blog.csdnimg.cn/img_convert/d5af2168850f2cb759cda30979a916bc.png)
总结
最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题
,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节 ,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
![](https://img-
blog.csdnimg.cn/img_convert/3fde2e1a759253a21e24efd8d4dbdb7b.webp?x-oss-
process=image/format,png)
![](https://img-
blog.csdnimg.cn/img_convert/858ca48488932b136292438057298f16.webp?x-oss-
process=image/format,png)
上述【高清技术脑图】以及【配套的面试真题PDF】可以点击我的GitHub免费获取
本文在开源项目:[https://github.com]中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
img-4TXzNYfJ-1710659097817)]
上述【高清技术脑图】以及【配套的面试真题PDF】可以点击我的GitHub免费获取
本文在开源项目:[https://github.com]中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
最后
从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。
因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。
干货主要有:
①1000+CTF历届题库(主流和经典的应该都有了)
②CTF技术文档(最全中文版)
③项目源码(四五十个有趣且经典的练手项目及源码)
④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ CTF/渗透测试工具镜像文件大全
⑦ 2023密码学/隐身术/PWN技术手册大全
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
扫码领取
![](https://img-blog.csdnimg.cn/img_convert/691ac0e931cd240934d6bdf74ecc16fe.jpeg)