• 作者:老汪软件技巧
  • 发表时间:2024-11-26 21:03
  • 浏览量:

Flutter性能优化实践

Flutter作为一款高性能、高质量的移动开发框架,在开发过程中仍然需要进行一些性能优化,以确保应用的流畅性和响应速度。以下是一些关键的Flutter性能优化策略:

1、减少Widget重建2、避免不必要的UI重绘

/riːˈpeɪnt/ 重画;重新绘制

3、优化图片加载4、使用异步操作flutter长列表加载大量网络图片,程序直接崩溃

imageCache.maximumSize = 10

Flutter 常用插件网络请求diojson解析json_serializable持久化操作本地存储shared_preferences路由管理fluro网络加载图片并缓存本地cached_network_image屏幕适配flutter_screenutil极光推送jpush_flutter全局状态管理provider轮播图flutter_swiper上拉刷新,下拉加载pull_to_refresh、flutter_easyrefresh高德地图SDK插件amap_flutter_map是一个能够快速便捷的为原生应用提供 Flutter 混合的集成方案FlutterBoostfluttertoast (toast)Flutter状态管理setState&Provider&Bloc区别setState:Provider:BlocProvider原理

Provider的作用主要有两个

Provider对InheritedWidget有哪些优点为什么使用Provider而不是Bloc(见仁见智)请简单介绍下Flutter框架,以及它的优缺点

优点

缺点

Widget生命周期

flutter生命周期其实就是Widget的生命周期,生命周期的回调函数体现在了State上面。 主要可以分成两方面讨论

1、StatelessWidget

StatelessWidget是一个无状态的Widget,它不会根据用户交互或内部状态的变化进行重建。因此,StatelessWidget的生命周期相对简单,主要涉及:

2、StatefulWidget

StatefulWidget是一个有状态的Widget,它可以根据状态的变化进行更新和重建。StatefulWidget的生命周期更为复杂,包括以下阶段:

简单的解释下Flutter的FrameWork层和Engine层FrameWork层

Dart编写的UI框架

Engine层

Skia是Google的一个 2D的绘图引擎库

flutter渲染原理(或者页面绘制逻辑)

自写UI渲染引擎实现跨平台

Flutter渲染流程大致如下:

说下Widgets、RenderObjects 和 Elements的关系

因为是Flutter是一种树结构,而我们的widget不稳定,会经常变化,如果每次修改一个小的widget都要重新渲染一次界面会比较消耗性能。

为了解决这个问题,引入了Element Tree。Element Tree和widget Tree根据key和widget进行比较,如果发生改变,就渲染改变的部分

关系BuildContext build(BuildContext context)

BuildContext主要用于构建 UI 和管理状态

Context记录当前Widget在Widget Tree中的具体位置和相关信息,用以保证各个子Widget和其parent的相对位置等信息

无BuildContext跳转

MaterialApp的构造函数有个navigatorKey的参数,定义一个全局的GlobalKey, 再在需要使用当前BuildContext的地方,直接从GlobalKey中获取即可

// 需要先配置到MaterialApp的navigatorKey属性才可真正使用
  static final GlobalKey<NavigatorState> globalNavigatorKey =
      GlobalKey<NavigatorState>();
  var currentContext = GlobalKey.currentContext

Flutter事件响应过程Flutter中的路由管理是如何实现的?Flutter 路由管理中有两个非常重要的概念:

根据是否需要提前注册页面标识符,Flutter 中的路由管理可以分为两种方式:

我有三个页面,A、C是flutter页面,B是原生页面,我从A到B再到C,然后返回A,页面会卡死。但是如果只是从A到B再返回,或者是从A到C再返回flutter run实际走了哪三个命令?分别用于什么操作?

adb am start:启动应用

Flutter开发插件的流程1、创建Flutter插件项目

使用Flutter命令行工具创建插件项目。命令格式通常为:flutter create --template=plugin [插件名称] 。这里--template=plugin参数指定了创建一个插件项目。

可以通过添加--platforms=android,ios来指定同时支持Android和iOS平台。

可以使用-i和-a选项来指定iOS和Android平台的开发语言,如Swift和Java。

2、 编写插件代码

Dart代码:在lib目录下创建Dart文件,该文件将作为Flutter端与原生端通信的桥梁。使用MethodChannel来定义与原生代码交互的通道。

原生代码:

3、实现功能4、准备发布Flutter 是如何与原生Android、iOS进行通信的

Flutter 为开发者提供了一个轻量级的解决方案,即逻辑层的方法通道( PlatformChannel )机制

使用注意点

简述下Flutter 的热重载

热重载是指,在不中断 App 正常运行的情况下,动态注入修改后的代码片段。

Flutter 的热重载功能可帮助您在无需重新启动应用程序的情况下快速添加功能以及修复错误。通过将更新的源代码文件注入到正在运行的 Dart 虚拟机(VM) 来实现热重载。在虚拟机使用新的字段和函数更新类之后, Flutter 框架会自动重新构建 widget 树,以便您可以快速查看更改的效果

Flutter编译方式

Flutter在Debug和Relase执行不同的编译模式

Widget 唯一标识Key有哪几种?

key的作用: 主要决定是否要刷新widget

Key本身是一个抽象,不过它也有一个工厂构造器,创建出来一个ValueKey

直接子类主要有:LocalKey和GlobalKey

_求职者面试_求职者面试问题大全及答案大全

Flutter跟原生交互遇到过什么问题1、OOM堆内存溢出,内存暴涨2、插件实现缺失错误

iOS中运行Flutter应用时,可能会遇到MissingPluginException错误,提示某个方法在指定的channel上没有找到实现。这通常是因为Flutter插件在iOS端没有被正确注册或初始化。

解决方案:

问题解决

定义全局字符串常量

3、消息传递问题

使用MethodChannel、BasicMessageChannel或EventChannel等通道进行Flutter与iOS原生代码之间的消息传递时,可能会遇到消息丢失、格式错误或解析失败等问题。

解决方案:

问题解决

确定好格式

{
  "code":"",
  "message":"",
  "data":""
}

4、权限和配置问题

问题描述:

在iOS设备上运行Flutter应用时,可能会遇到与权限相关的错误,如相机、麦克风或位置权限未被授予。

解决方案:

5、iOS混合flutter,网络请求用iOS原生的还是用flutter的

最好用dio

iOS原生的网络请求iOS flutter混编,怎么解决用户信息同步问题FlutterViewController

FlutterViewController是iOS平台上的一个控制器,用于管理Flutter引擎和Flutter视图的展示。它允许iOS开发者在iOS应用中嵌入Flutter模块,实现跨平台的UI和功能。

使用方法

FlutterViewController与Flutter引擎的关系

管理方式:

iOS 项目中混编Flutter路由管理问题、怎么统一路由表Flutter与iOS混编中的路由问题路由注册:路由跳转:路由返回:FlutterBoost是单页面模式还是多页面模式

在FlutterBoost1.0版本中,它主要是单页面模式,即不管你打开多少Flutter页面,其实呈现页面的FlutterViewController或者FlutterView其实仅有一个。这种模式是出于节省内存的考虑,但也可能导致一些问题,如页面切换时的白屏或黑屏问题,以及页面生命周期管理的复杂性。

在FlutterBoost的新版本中,它不再维护单一的FlutterViewController(或FlutterView),而是和原生一样,每次有新页面请求时就直接打开新的ViewController或者FlutterView。这样,每个Flutter页面都可以有自己的生命周期管理,解决了之前单页面模式下的一些问题。

iOS Flutter混编,单引擎、多引擎单引擎方案

单引擎方案指的是在整个iOS应用中,只使用一个FlutterEngine来渲染所有的Flutter页面。

FlutterBoost是单引擎方案

优点:缺点:适用场景:

适用于整个应用都采用Flutter开发,且Flutter内部页面采用Flutter路由跳转的情况。

FlutterBoost

FlutterBoost是单引擎方案

引擎复用:FlutterBoost通过维护一个Flutter引擎缓存(如FlutterEngineCache类),来存储和复用Flutter引擎实例。当需要打开新的Flutter页面时,FlutterBoost会首先尝试从缓存中获取现有的引擎实例

高效的内存管理:由于采用单引擎方案,FlutterBoost能够更有效地管理内存资源,减少内存占用。简化的插件通道管理:所有的Flutter页面都共享同一个FlutterEngine,因此插件通道也只需要管理一套,简化了插件的调用和管理。增强的用户体验:FlutterBoost提供了流畅的页面跳转和动态更新能力,增强了用户的体验。多引擎方案FlutterEngineGroup

多引擎方案指的是在iOS应用中,使用多个FlutterEngine来渲染不同的Flutter页面。

优点:缺点:适用场景:

适用于需要在iOS应用中嵌入多个独立的Flutter模块,或者需要实现复杂的页面跳转和动态更新的情况。

为什么市面多引擎用的人那么少?

内存崩溃风险、插件管理相对复杂

iOS 项目中混编Flutter,怎么单独调试Flutter模块

flutter attach 调试

连接设备:使用flutter attach命令:

1、使用vscode

VSCode编辑 launch.json -> 追加如下代码:

{
    "name": "Flutter: Attach to Device",
    "type": "dart",
    "request": "attach"
}

Flutter内存泄露Dart的内存分配与垃圾回收是怎么样的?

内存分配策略比较简单,创建对象时只需要在堆上移动指针,内存增长始终是线性的,省去了查找可用内存的过程

Dart 的垃圾回收,则是采用了多生代算法。新生代在回收内存时采用“半空间”机制,触发垃圾回收时,Dart 会将当前半空间中的“活跃”对象拷贝到备用空间,然后整体释放当前空间的所有内存。回收过程中,Dart 只需要操作少量的“活跃”对象,没有引用的大量“死亡”对象则被忽略,这样的回收机制很适合 Flutter 框架中大量 Widget 销毁重建的场景。

内存泄露原因内存泄露检测线下Flutter错误收集布局溢出线上异常收集Flutter 3.0相对于2.0有哪些优化1.全平台支持增强2. 性能提升3. 组件更新与改进4. 开发工具增强Dart 3.0相对于2.0有哪些优化1、健全的空值安全Flutter怎么适配屏幕普通手机折叠屏适配大屏幕适配