Fair是为Flutter设计的动态化框架,通过Fair Compiler工具对原生Dart源文件的自动转化,使项目获得动态更新Widget的能力。
Fair 的接入和使用,建议大家阅读在线文档:
在线文档:https://fair.58.com/
Fair的UI渲染是无损的,可以做到像素级别的还原,看一张转义Best Flutter UI Templates部分页面后的效果:
使用的工程来自 https://github.com/mitesh77/Best-Flutter-UI-Templates
项目位置:/example/lib/best_flutter_ui
简单几步,接入Fair.
step1:同步fair工程代码
推荐同步 fair 相关代码,并且进行本地依赖:
同步方式:
git clone https://github.com/wuba/fair.git
step2:在 pubspec.yaml
添加依赖
将Fair工程和对应的业务工程放在同一个目录中,并添加依赖:
# add Fair dependency
dependencies:
fair: 2.7.0
# add build_runner and compiler dependency
dev_dependencies:
build_runner: ^2.0.0
fair_compiler: ^1.2.0
# switch "fair_version" according to the local Flutter SDK version
# Flutter SDK 3.0.x(3.0.0、3.0.1、3.0.2、3.0.3、3.0.4、3.0.5) -> flutter_3_0_0
# Flutter SDK 2.10.x(2.10.0、2.10.1、2.10.2、2.10.3) -> flutter_2_10_0
# Flutter SDK 2.8.x(2.8.0、2.8.1) -> flutter_2_8_0
# Flutter SDK 2.5.x(2.5.0、2.5.1、2.5.2、2.5.3) -> flutter_2_5_0
# Flutter SDK 2.0.6 -> flutter_2_0_6
# Flutter SDK 1.22.6 -> flutter_1_22_6
dependency_overrides:
fair_version:
path: ../fair/flutter_version/flutter_3_0_0
step3:将App替换为FairApp
void main() {
WidgetsFlutterBinding.ensureInitialized();
FairApp.runApplication(
_getApp(),
plugins: {
},
);
}
dynamic _getApp() => FairApp(
modules: {
},
delegate: {
},
child: MaterialApp(
home: FairWidget(
name: 'DynamicWidget',
path: 'assets/bundle/lib_src_page_dynamic_widget.fair.json',
data: {"fairProps": json.encode({})}),
),
);
step4:添加FairWidget作为动态Widget
FairWidget(
name: 'DynamicWidget',
path: 'assets/bundle/lib_src_page_dynamic_widget.fair.json',
data: {"fairProps": json.encode({})}),
更新时间:2022.07.05
- 1.Fair 支持加载手机磁盘路径上的 bundle 文件;
- 2.适配 Flutter SDK 2.10.0、2.10.1、2.10.2、2.10.3 版本;
- 3.Dart2JS 支持解析 static 方法;
- 4.运行时,页面错误信息提示优化;
- 5.语法糖支持解析 Model 数据。
更新时间:2022.05.31
- 适配 Flutter SDK 2.8.0、2.8.1
- Dart2JS 支持解析单例
- 新增语法糖Sugar.switchCase、Sugar.colorsWithOpacity、Sugar.convertToString等
全面优化example结构,升级example体验,更适合新手入门。
在源码中,新增 example 工程,用于提供 Fair API 的标准用法。
example 工程位置:fair/example
更新时间:2022.05.12
- 修复 FairLogger 文件导包问题
- 升级 analyzer 到 2.3.0
更新时间:2022.04.26
- FlatBuffers 支持在 null safe 环境下生成 bin 文件
更新时间:2022.04.22
- 支持空安全 null-safe
- 适配Flutter SDK 2.5.0、2.5.1、2.5.2、2.5.3等版本
- 升级 sample 工程里过时的demo
- 补充 sample 工程里 iOS 的运行环境
- 主版本计划
- null-safe 版本支持,预计4月22日上线 ✅
- Flutter 2.8.0版本适配,预计5月中旬上线 ✅
- Flutter 2.10.0版本适配,预计6月初上线
- IDE 语法检测和提示插件
- 丰富语法糖
- 热更新平台
- Dart Server工程搭建 ✅
- Flutter Web工程搭建 ✅
- 补丁/资源管理
- 项目管理
- 移动端 Update&Download
- 线上动态化
- Flutter Web工程搭建 ✅
- Dart Server工程搭建 ✅
- Action编辑
- 代码编辑
- 组件编辑
- 页面编辑
- 工程编辑
- Flutter效果预览
- Fair DSL预览
Thanks goes to these wonderful people (emoji key):
Wu 💻 📖 |
Penta 💻 📖 |
haijun 💻 📖 |
陈有余 💻 📖 |
yangyang 💻 |
wan 💻 |
bujie 💻 |
Kc 💻 |
gongpengyang 💻 |
qixu 💻 |
waynesonic 💻 |
paozhuanyinyu 💻 |
alzzzz 💻 📖 |
xiangwc 💻 |
WangYk 💻 |
SunWei 💻 |
This project follows the all-contributors specification. Contributions of any kind welcome!
Star&Fork 是对我们最大的支持~
- Flutter动态化框架Fair文档上线&开源倒计时
- Flutter动态化框架Fair的设计与思考
- Fair 2.0 逻辑动态化开源了!
- Fair逻辑动态化架构设计与实现
- Fair逻辑动态化通信实现
- Fair下发产物-布局DSL生成原理
- Fair 逻辑语法糖设计与实现
- Fair热更新设计与实现
- Fair在安居拍房App中的实践
- Flutter 动态化项目评测
- Fair 在 58 同城拍客 App 中的实践
通过Issue提交问题,贡献代码走Pull Request,管理员将对代码进行审核。
对Fair感兴趣的小伙伴,可以加入交流群。技术咨询、讨论,请移步至
微信 | 美事(内部) |
---|---|
微信入群:请先添加58技术小秘书为好友,备注fair,小秘书邀请进群。
由于dart语法解析工作量奇大,会有部分语法和特殊使用方式的限制。 下面是一些,不支持特性&已知问题:
自查步骤(新手必读)
- 核对flutter版本与readme说明,确认该版本已被Fair支持
- 核查version分支版本于flutter一致,且等同于第一步版本号
- 如果尚未看过文档,请先运行自带的sample,能跑起来再接入app
- 遇到编译错误,请查看终端日志,过滤fair关键词
- 使用动态化组件的过程中,不建议格式化生成的Javascript文件,格式化工具可能会修改文件内容,导致执行报错
- 到github提issue,或gitter。留档/解决,并提供flutter环境信息
flutter doctor --verbose
- 为什么没有bin产物?
bin为可选的flatbuffer产物,fair 2期开源了 fairc和dart2js编译转换工具。
- 执行flutter pub run build_runner build后没有产物?
请根据适配要求,核查flutter,dart版本
- 执行flutter pub run build_runner build后,提示编译错误信息?
根据错误日志,有几种情况:1.原代码中存在逻辑表达式,语法解析不通过,尝试剥离逻辑为module;2..dart_tool
文件权限问题,请删除后重试
Fair项目基于BSD协议开源。我们使用的更多依赖库详见pubspec.yaml
感谢UXD的Kaibin老师提供设计支持