-
sliverpinnedtoboxadapter
,可以通过它轻松创建一个置顶的元素,当child
没有layout
之前,你没法知道child
的实际大小,这将是非常有用的组件。 -
extendedsliverappbar
,你可以创建一个跟sliverappbar
一样效果的组件,而不用去关心expandedheight
。
tabbarview 扩展
extendedtabs,对 tabbarview
组件的扩展,主要包括以下功能:
- 解决多级
tabbarview
嵌套的时候,无法连贯切换的问题 - 垂直方向滚动
- 设置缓存页面数量
- 提供
carouselindicator
和colortabindicator
![]() | ![]() |
文本
extendedtext,针对 text
组件的扩展,主要包括以下功能:
- 方便快速生成特殊文本,将字符串转换成特定的
inlinespan
。 -
backgroundtextspan
自定文字背景,处理圆角或者中英文背景高度不一致的问题。 -
extendedwidgetspan
支持选择和复制, github.com/flutter/flu… . -
textoverflowwidget
自定义文本溢出效果, github.com/flutter/flu… 。
![]() | ![]() |
![]() | ![]() |
输入框
extendedtextfield,针对 textfield
组件的扩展,主要包括以下功能:
- 方便快速生成特殊文本,原理很简单,就是把字符串转换成特定的
inlinespan
。 -
extendedwidgetspan
支持输入框中插入任何widget
,比如表情图片。 -
extendedwidgetspan
支持选择和复制, github.com/flutter/flu… 。
![]() | ![]() |
![]() | ![]() |
路由注解
ff_annotation_route,通过注解生成路由映射,统一处理路由,支持 navigator 1.0
和 navigator 2.0
。
- 激活工具
pub global activate ff_annotation_route
- 增加引用
dependencies:
在子模块中引入
ff_annotation_route_core: any
在根项目引入,包括一些帮助类以及 ff_annotation_route_core
ff_annotation_route_library: any
- 添加注释
工具会自动处理带参数的构造,不需要做特殊处理。唯一需要注意的是,你需要设置 argumentimports
来为 class/enum
的参数提供 import
地址。现在你也可以使用 @ffargumentimport()
注释来替代.
@ffargumentimport(‘hide testmode2’)
import ‘package:example1/src/model/test_model.dart’;
@ffargumentimport()
import ‘package:example1/src/model/test_model1.dart’ hide testmode3;
import ‘package:ff_annotation_route_library/ff_annotation_route_library.dart’;
@ffroute(
name: ‘fluttercandies://testpagee’,
routename: ‘testpagee’,
description: ‘show how to push new page with arguments(class)’,
// argumentimports are still work for some cases which you can’t use @ffargumentimport()
// argumentimports: [
// ‘import ‘package:example1/src/model/test_model.dart’;’,
// ‘import ‘package:example1/src/model/test_model1.dart’;’,
// ],
exts: <string, dynamic>{
‘group’: ‘complex’,
‘order’: 1,
},
)
class testpagee extends statelesswidget {
const testpagee({
this.testmode = const testmode(
id: 2,
istest: false,
),
this.testmode1,
});
factory testpagee.deafult() => testpagee(
testmode: testmode.deafult(),
);
factory testpagee.required({@required testmode testmode}) => testpagee(
testmode: testmode,
);
final testmode testmode;
final testmode1 testmode1;
}
- 执行命令生成路由,
ff_route <command> [arguments]
,全部命令如下:
-h, --[no-]help 帮助信息。
-p, --path 执行命令的目录,默认当前目录。
-o, --output route 和 helper 文件的输出目录路径,路径相对于主项目的 lib 文件夹。
-n, --name 路由常量类的名称,默认为 routes
。
-g, --git 扫描 git 引用的 package,你需要指定 package 的名字,多个用 ,
分开
–routes-file-output routes 文件的输出目录路径,路径相对于主项目的lib文件夹
–const-ignore 使用正则表达式忽略一些const(不是全部const都希望生成)
–[no-]route-constants 是否在根项目中的 xxx_route.dart
生成全部路由的静态常量
–[no-]package 这个是否是一个 package
–[no-]supper-arguments 是否生成路由参数帮助类
-s, --[no-]save 是否保存命令到本地。如果保存了,下一次就只需要执行 ff_route
就可以了。
–[no-]null-safety 是否支持空安全,默认 true
- 设置
materialapp
的ongenerateroute
回调
import ‘package:ff_annotation_route_library/ff_annotation_route_library.dart’;
import ‘package:flutter/material.dart’;
import ‘example_route.dart’;
import ‘example_routes.dart’;
void main() => runapp(myapp());
class myapp extends statelesswidget {
// this widget is the root of your application.
@override
widget build(buildcontext context) {
return materialapp(
title: ‘ff_annotation_route demo’,
debugshowcheckedmodebanner: false,
theme: themedata(
primaryswatch: colors.blue,
),
initialroute: routes.fluttercandiesmainpage,
ongenerateroute: (routesettings settings) {
return ongenerateroute(
settings: settings,
getroutesettings: getroutesettings,
routesettingswrapper: (ffroutesettings ffroutesettings) {
if (ffroutesettings.name == routes.fluttercandiesmainpage ||
ffroutesettings.name ==
routes.fluttercandiesdemogrouppage.name) {
return ffroutesettings;
}
return ffroutesettings.copywith(
widget: commonwidget(
child: ffroutesettings.widget,
title: ffroutesettings.routename,
));
},
);
},
);
}
}
- 打开一个页面
navigator.pushnamed(
context,
routes.fluttercandiestestpagee.name,
arguments: routes.fluttercandiestestpagee.requiredc(
testmode: const testmode(
id: 100,
istest: true,
),
),
);
可拖拽容器
draggablecontainer,可拖拽容器,支持元素移动动画效果,主要包括以下功能:
- 可拖动子元素
- 可删除子元素
- 可固定子元素
- 元素移动动画效果
图片编辑
imageeditor,强大的原生图片处理库,主要包括以下功能:
- 裁剪
- 翻转
- 旋转
- 缩放
- 色彩矩阵变化
- 添加文字
- 混合图片
- 添加任意图形
dialog
smartdialog,一种更优雅的dialog 解决方案,主要解决了系统自带的dialog的一些问题:
- 必须传 buildcontext。
- 无法穿透暗色背景,点击 dialog 后面的页面。
- 解决系统自带 dialog 写成的 loading 弹窗,在网络请求和跳转页面的情况,会存在路由混乱的情况。
资源选择器
assetpicker,对标微信的多选资源选择器,99%接近于原生微信的操作,主要包括以下功能:
- ♻️ 支持基于代理重载的全量自定义
- 💚 99% 的微信风格
- 📷 图片资源支持
- 🔬heic 格式图片支持
- 🎥 视频资源支持
- 🎶 音频资源支持
- 1️⃣ 单资源模式
- 💱 国际化支持
- ➕ 特殊 widget 构建支持(前置/后置)
- 🗂 自定义路径排序支持
- 📝 自定义文本构建支持
- ⏳ 自定义筛选规则支持(
photo_manager
) - 🎏 完整的自定义主题
- 💻 支持 macos
![]() | ![]() | ![]() |
---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
相机资源选择器
camerapicker,对标微信的视频资源选择器,99%接近于原生微信的操作,主要包括以下功能:
- 🔐 支持健全的空安全
- 💚 99% 的微信风格
- 📷 支持拍照
- ☀️ 支持设置曝光参数
- 🔍️ 支持捏合缩放
- 🎥 支持录像
- ⏱ 支持限制录像时间
- 🔍 支持录像时缩放
- 🖾 支持自定义前景 widget 构建
![]() | ![]() |
---|---|
![]() | ![]() |
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/… |
点赞按钮
likebutton,仿推特点赞效果,支持数字动画效果。
增量加载列表
loadingmorelist,支持各种布局的增量加载列表,主要包括以下功能:
- listview
- gridview
- 瀑布流
- 多个 sliver 布局
- 自定义加载状态 ui
- 监控进入
viewport
元素 - 类聊天列表布局
- 监控元素回收
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
下拉刷新
pulltorefreshnotification,灵活的自定义下拉刷新组件,可以创造出任意的下拉刷新样式。
![]() | ![]() |
![]() | ![]() |
底部扩散模糊动画
ripplebackdropanimatepage,骚气十足的模糊动画,只需要几行代码就能帮你实现。
弹出菜单
wpopupmenu,目前最好用的仿微信聊天长按弹出框。
瀑布流
waterfallflow,高性能的瀑布流布局,github.com/flutter/flu… 。
- 高性能
- 易上手,跟
gridview
一样的api
- 可监控进入
viewport
元素 - 可监控元素回收
![]() | ![]() |
![]() | ![]() |
迁移
指南
感谢 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>
的影响是非常大的。
下面我们来跟一波可空
列表在做 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;
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加vx:vip204888 (备注网络安全获取)
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
一个人可以走的很快,但一群人才能走的更远。不论你是正从事it行业的老鸟或是对it行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
一个人可以走的很快,但一群人才能走的更远。不论你是正从事it行业的老鸟或是对it行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-1xhjva79-1712951693569)]
发表评论