flutter知识点
0.打包命令
flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi
1.软键盘遮挡输入框
Scaffold(
resizeToAvoidBottomInset:false)
2.数据存储方式
1.文件
2.插件shared_preferences
3.数据库
1.google离线同步 firebase_database: ^10.2.2 国内无法使用。
2.sqflite sq语句太繁琐了
3. Isar 类似greendao
3.与原生通信方式
1.BasicMessageChannel
2.MethodChannel
3.EventChannel
4.ListView报Vertical viewport was given unbounded height错误解决方法
错误解析:宽度或高度溢出,导致Widget不显示
解决方法:给ListView的shrinkWrap属性设置为true,即父视图的大小跟随子组件的内容大小
return Column(
children: <Widget>[
ListView.builder(
itemCount: sourceDataComments.length,
itemBuilder: _buildCommentsRow,
shrinkWrap: true, ), ], );
5.flutter生命周期
6.Flutter不具备反射,如果要使用反射,你应该如何使用?
使用Mirror
ClassMirror:Dart 类的反射类型
InstanceMirror:Dart 实例的反射类型
ClosureMirror: 闭包的反射类型
DeclarationMirror:类属性的反射类型
IsolateMirror:Isolate 的反射类型
MethodMirror:Dart 方法(包括函数、构造函数、getter/setter 函数)的反射类型
7.热更新
8.如何让Flutter 编译出来的APP的包大小尽可能的变小?
1. 移除无用代码和无用资源,压缩图片, 安卓里拆 App Bundle,
2. Dart 编译产物做针对性优化
动态下发:剥离 Data 段及一切非必要产物,打包后动态下发。
内置压缩:以二进制形态内置动态下发包。
3. Flutter 引擎编译产物优化
主要优化思路有升级 Bulild Tools 统一双编译参数,
定制化编译裁剪引擎内部部分特定无用功能。
4. 机器码指令优化
精简机器码指令,Google 也回复称未来 Dart 与 OC 基本持平。
flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi
9.flutter跨平台原理
10.Flutter混合开发——FlutterBoost
11.Flutter渲染优化
控制 build 方法耗时,将 Widget 拆小,避免直接返回一个巨大的 Widget,这样 Widget 会享有更细粒度的重建和复用;
尽量不要为 Widget 设置半透明效果,而是考虑用图片的形式代替,这样被遮挡的 Widget 部分区域就不需要绘制了
对列表采用懒加载而不是直接一次性创建所有的子 Widget,这样视图的初始化时间就减少了
12.Flutter启动优化
1. 让 Flutter 中重建组件的个数尽量少
在实际开发过程中,如果将整个页面写在一个单独的 StatefulWidget 中,那么每次状态更新时都会导致很多不必要的 UI 重建。因此, 我们要学会拆解组件,使用良好设计模式和状态管理方案,当需要更新状态时将影响范围降到最小。
2. 构建组件时使用 const 关键词,可以抑制 widget 的重建
合理利用 const 关键词,可以在很大程度上优化应用的性能
使用 const 也需要注意如下几点:
当 const 修饰类的构造函数时,它要求该类的所有成员都必须是final的。
const 变量只能在定义的时候初始化。
3. Flutter实现的一些效果背后可能会使用 saveLayer() 这个代价很大的方法
如下这几个组件,底层都会触发 saveLayer() 的调用,同样也都会导致性能的损耗:
ShaderMask
ColorFilter
Chip,当 disabledColorAlpha != 0xff 的时候,会调用 saveLayer()。
Text,如果有 overflowShader,可能调用 saveLayer() ,
4. 官方也给了我们一些非常需要注意的优化点:
由于 Opacity 会使用屏幕外缓冲区直接使目标组件中不透明,因此能不用 Opacity Widget,就尽量不要用。有关将透明度直接应用于图像的示例,请参见 Transparent image,比使用 Opacity widget 更快,性能更好。
要在图像中实现淡入淡出,请考虑使用 FadeInImage 小部件,该小部件使用 GPU 的片段着色器应用渐变不透明度。
很多场景下,我们确实没必要直接使用 Opacity 改变透明度,如要作用于一个图片的时候可以直接使用透明的图片,或者直接使用 Container:Container(color: Color.fromRGBO(255, 0, 0, 0.5))
Clipping 不会调用 saveLayer()(除非明确使用 Clip.antiAliasWithSaveLayer),因此这些操作没有 Opacity 那么耗时,但仍然很耗时,所以请谨慎使用。
5. 管理着色器编译垃圾
有时候,应用中的动画首次运行时会看起来非常卡顿,但是运行多次之后便可以正常运行,这可能就是由于着色器编译混乱导致的。
在不同平台上,可以执行以下命令,使用 SkSL 预热功能构建应用程序:
安卓
flutter build apk — bundle-sksl-path flutter_01.sksl.json
IOS
flutter build ios --bundle-sksl-path flutter_01.sksl.json
13.谈谈Flutter的内存回收管理机制,以及你平时是怎么处理内存的?内存泄漏和内存溢出你是怎么解决的?
Dart的垃圾回收是分代的:年轻代和老年代
GC与Flutter engine建立联系,当engine检测到应用程序处于空闲状态且没有用户交互时,它会发出通知。这样就使得GC有了收集的窗口从而不影响性能。
年轻代
这个阶段旨在清除寿命较短的短暂对象,例如stateless widgets。虽然它是阻塞的,但它比老年代mark-sweep快得多,并且当与调度结合使用时,几乎不会影响程序的运行。
要确定哪些对象是否可被回收,收集器将以root对象(例如堆栈变量)开始,并检查它们引用的对象。然后把引用的对象移动到另一半空间。在那里它检查这些移动的对象指向的内容,并移动这些引用的对象。如此反复,直到移动所有活动对象到另一半空间。始终没有被引用的对象将被回收。
老年代(并行标记和并发扫描)
当对象经历过一定次数的GC仍然存在,或者其生命周期较长(个人猜测类似于element和RenderObject这种需要多次复用,可变且创建比较耗费性能),将其放入老年代区域中。老年代采用标记整理的方法来回收对象。
这种GC技术有两个阶段:首先遍历对象图,并标记仍在使用的对象。在第二阶段期间,扫描整个存储器,并且回收未标记的任何对象。然后清除所有标志。
14.实体类分类
DO(Data Object):此对象与数据库表结构一一对应,通过 DAO层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,Service 或Manager 向外传输的对象。
BO(Business Object):业务对象,可以由Service层输出的封装业务逻辑的对象。
Query:数据查询对象,各层接收上层的查询请求。注意超过2 个参数的查询封装,禁止使用 Map 类 来传输。
VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
15.启动页白屏广告-插件
flutter_native_splash