flutter已经支持安卓热更新_Flutter入门,一篇懂

6963711e0d4b98e3200a960fc6ee0dae.gif

1、Flutter简介

        Flutter是Google推出的开源移动UI框架,开发者可以开发一套代码同时运行在Android和IOS两个平台,实现应用的快速开发。Flutter虽然出现较晚,在Google的大力推广下生态正在快速完善,活跃用户也在高速增长,Flutter的版本也在不断更新。

        Flutter使用自己的高性能渲染引擎来绘制widget,这样不仅可以保证在Android和iOS上UI的一致性,而且也可以避免对原生控件依赖而带来的限制及高昂的维护成本。Flutter使用Skia作为其2D渲染引擎,Skia是Google的一个2D图形处理函数库,包含字型、坐标转换,以及点阵图都有高效能且简洁的表现,Skia是跨平台的,并提供了非常友好的API,目前谷歌浏览器和Android均采用Skia作为其绘图引擎。

603aabd7832ee3fe949a29633c883430.png

        Flutter使用Dart语言进行开发,最终编译成各个平台的Native代码。架构图如上图所示分为了三层,自上向下依次为:

1)Framework层,使用dart实现,包括常用Widgets、动画、手势等基础组件库。在基础组件库之上,Flutter还提供了 Material 和Cupertino两种视觉风格的组件库。

2)Engine层,其中包括了 Skia引擎、Dart运行时、文字排版引擎等。在代码调用 dart:ui库时,调用最终会走到Engine层,然后实现真正的绘制逻辑。

3)Embedder层,是一个嵌入层,通过该层把Flutter嵌入到各个平台。它的主

要工作包括Surface渲染设置、线程设置、以及插件等。

2、平台技术对比

        对于体验移动端体验来说,原生开发有明显的优势,但是原生开发存在的缺点也是很明显的,如开发成本高,不同平台必须维护不同代码,且大多数情况下,有新功能更新时只能发版,因此跨平台技术应运而生。到目前为止,跨平台技术主要有H5、React Native(RN)、Weex和Flutter等等。

1)UI渲染

  • H5通过原生的网页加载控件WebView (Android)或WKWebView(iOS)来加载

  • Weex和RN将虚拟DOM映射为原生控件,使用原生渲染

  • Flutter实现了自绘引擎,调用原生系统API渲染

2)性能

  • H5使用WebView渲染效率较低,很多H5在iOS平台表现尚可,但是在Android上特别是一些低端机上的表现更差。

  • Weex和RN通过映射生成原生控件,性能较H5有了很大的提高,接近原生应用

  • Flutter直接调用系统API绘制,且Dart在发布时可以通过AOT生成高效的ARM代码以保证应用性,性能最接近原生

3)动态化

  • H5实现的是APP需要动态变动的一部分内容,可以随时改变而不用发版。

  • Weex和RN支持热部署,可以随时更新功能而不需要像原生应用一样发版

  • Flutter的Release包默认是使用Dart AOT模式编译的,所以不支持动态化

      此外,Flutter的热重载可帮助开发者快速地进行测试、构建UI、添加功能并更快地修复错误。在iOS和Android模拟器或真机上可以实现毫秒级热重载,并且不会丢失状态,在开发效率上,要比H5、RN和Weex高。下表是对以上提到的跨平台技术的对比汇总。

框架

UI渲染方式

性能

开发效率

动态化

H5

WebView渲染

一般

支持

Weex、RN

原生控件渲染

支持

Flutter

调用系统API渲染

默认不支持

3、混合开发方案

       具有一定规模的App通常有一套成熟通用的基础库,那么使用Flutter重新从头开发App的成本和风险都较高,因此混编方案成为现有APP使用Flutter开发的选择。

1)官方推荐方案

        使用官方推荐方案集成Flutter到已有APP,需要开发者配置Flutter环境并采用Flutter工程结构来作为日常开发。

优点:

  • 可直接在原工程内开发,每次修改代码后,不需要先进行代码同步然后再看效果,可无缝同步到native工程中,即时预览。

  • 不需要单独拆分组件,节省了组件版本开发及发布的成本

缺点:

  • 非常耦合,需要修改原有native工程配置,需要添加特定脚本去编译 Flutter

  • 如果使用pod管理,需要修改xcconfig 配置

  • 团队所有开发成员都必须配置 Flutter 开发环境

2)Flutter 组件化混编方案

        该方案的核心是Flutter组件化,项目只需引入Flutter编译后的产物,不需要每次都调用脚本进行编译,也不需要强耦合Flutter环境,只需要有发布开发需求的同学安装Flutter环境即可。

优点:

  • 不需修改原有xcconfig配置。

  • 不需要添加RunScript脚本。

  • 运行不需要依赖Flutter环境。

缺点:

  • 需要单独管理一个flutter私有索引库。

  • 开发加载Flutter页面,首次需要热更新同步Flutter代码。

4、Flutter开源框架

        阿里巴巴闲鱼是Flutter的使用及推广者之一,在Flutter开发技术方面

形成了自己的体系,在组件化、Flutter管理、集成等方面都有大量技术输出,并且有多个开源框架。

1)Fish Redux

        Fish Redux是闲鱼技术团队在GitHub上开源的,一个基于 Redux 数据管理的组装式flutter应用框架,在解决Flutter集中状态管理的同时,也解决了UI的组件化。特别适用于构建中大型的复杂应用,它最显著的特征是函数式的编程模型、可预测的状态管理、可插拔的组件体系、最佳的性能表现。

开源地址:https://github.com/alibaba/fish-redux

2)AOP for Flutter—AspectD

        AspectD是闲鱼技术团队开发的面向Dart的AOP开源框架,可以支持主流的AOP场景。AspectD的原理是基于Dill变换,这种变换面向的是近乎源代码级别的AST对象,不仅强大而且可靠。

开源地址:https://github.com/alibaba-flutter/aspectd

3)FlutterBoost

        FlutterBoost主要是为了解决Native App混合模式接入Flutter这个通用问题开发的可复用的Flutter插件,由闲鱼技术团队开发并开源。只要是集成了 Flutter的项目都可以用官方依赖的方式非常方便的以插件形式引入 FlutterBoost,只需要对工程进行少量代码接入即可完成接入。目前FlutterBoost已经在生产环境支撑着在闲鱼客户端中所有的基于Flutter开发业务,为更加复杂的混合场景提供了支持。

开源地址:https://github.com/alibaba/flutter_boost

内容参考来自:

Flutter中文网:https://flutterchina.club/

Flutter实战:https://book.flutterchina.club/

Flutter in Action——闲鱼最佳实践

也许想看

年终了,晋升的为什么不是你?

高精度QPS统计,看完不会你打我!

一文弄懂分布式锁实现

uni-app脚手架踩坑记

9e05ad2b13373dfd208b4dc28d768607.png

好文我在看?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于封装一个flutter_screenutil,您可以按照以下步骤进行操作: 1. 首先,在项目的`pubspec.yaml`文件中添加`flutter_screenutil`依赖项。可以在`dependencies`部分添加以下代码: ```yaml dependencies: flutter_screenutil: ^5.0.0 ``` 2. 在您的项目中创建一个名为`screen_util.dart`的文件,用于封装`flutter_screenutil`。 3. 在`screen_util.dart`文件中导入必要的库: ```dart import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter/material.dart'; ``` 4. 创建一个名为`ScreenUtil`的类,并添加以下静态方法: ```dart class ScreenUtil { static void init(BuildContext context) { FlutterScreenUtil.init(context); } static double setWidth(double width) { return FlutterScreenUtil().setWidth(width); } static double setHeight(double height) { return FlutterScreenUtil().setHeight(height); } static double setSp(double fontSize) { return FlutterScreenUtil().setSp(fontSize); } } ``` 5. 在您的项目中的`main.dart`文件中,使用`ScreenUtil.init(context)`初始化`ScreenUtil`,例如: ```dart void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { ScreenUtil.init(context); return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(), ); } } ``` 6. 现在,您可以在项目的任何地方使用`ScreenUtil.setWidth`、`ScreenUtil.setHeight`和`ScreenUtil.setSp`来设置宽度、高度和字体大小,例如: ```dart Container( width: ScreenUtil.setWidth(200), height: ScreenUtil.setHeight(100), child: Text( 'Hello', style: TextStyle(fontSize: ScreenUtil.setSp(20)), ), ), ``` 通过以上步骤,您可以封装一个简单的`flutter_screenutil`工具类,方便在项目中使用屏幕适配功能。希望对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值