flutter 基建
-
1. 屏幕适配(flutter_screenutil)
使用方式通过扩展函数.w、.h、.r等扩展函数进行直接使用
核心原理:按照设计稿和屏幕尺寸的比例进行缩放以此达到多个设备的UI适配;//1、在ScreenUtil中,通过MediaQuery获取屏幕信息: 宽度、高度、横竖屏 final screenWidth = MediaQuery.of(context).size.width; final screenHeight = MediaQuery.of(context).size.height; final orientation = MediaQuery.of(context).orientation; //2、将设计稿尺寸和屏幕尺寸运算获取缩放比例 double get scaleWidth => !_enableScaleWH() ? 1 : screenWidth / _uiSize.width; double get scaleHeight => !_enableScaleWH() ? 1 : (_splitScreenMode ? max(screenHeight, 700) : screenHeight) / _uiSize.height; double get scaleText =>!_enableScaleText() ? 1 : (_minTextAdapt ? min(scaleWidth, scaleHeight) : scaleWidth); //3、使用时,通过扩展函数.w、.h、.r通过动态运算进行获取适配后的尺寸 比如:50.w 跟踪代码可见 double get w => ScreenUtil().setWidth(this); double setWidth(num width) => width * scaleWidth; double get scaleWidth => !_enableScaleWH() ? 1 : screenWidth / _uiSize.width; 可见50.w的背后,是扩展函数的运用,是动态乘法的运算
因此每一次.w、.h、.r 类似的使用都是一次 乘法运算,性能开销极低,无需担心频繁调用
可能的优化的空间,可将缩放比例进行缓存,监听横竖屏切换则刷新缩放比例的值,以此能降低频繁运算的计算量 -
2. 对const的理解
1. const 用于声明编译时常量,其值必须在代码编写时确定,并在代码编译时完成计算,和 final 有一些区别, final 是运行时常量,在运行时才能确定其值:
const int a = 1 + 2; // ✅ 合法,1+2 是编译时可计算的表达式
const int b = DateTime.now().second; // ❌ 非法,运行时才能确定值
// final:运行时确定值
final int c = 1 + 2; // ✅
final int d = DateTime.now().second; // ✅
2. const 应用到性能优化中,当使用cosnt 修饰 widget 的时候,会把widget标记为不可变元素,那个父类Widget进行重建任务时候,就会跳过直接复用原有实例(减少内存分配和垃圾回收)
3. 同理2,热重载的时候,复用原有实例,加快刷新速度
4. 强制在编译期检测,避免错误。所以合理使用const 有利于性能优化
-
3. widget 的显示隐藏如何实现,隐藏时保留其状态
可以通过使用组件 Offstage 或 Visibility 实现其显示隐藏,是否占用布局,是否保留其状态的属性 -
4.聊聊 StatefulWidget 的生命周期