项目中的一些模块用flutter重新开发后在两次云测和灰度少量渠道后发现了些问题,分为两类:
一个是非编译/运行时问题,即dart语法使用错误或widget布局错误使用出现的问题
因为这类问题对于所有人几乎都会遇到,不再详细说解决方案,只简单罗列下我遇到的,提醒别人注意即可:
一、非编译/运行问题
1 黑黄相间提示:内容溢出
需要显示的内容超出了widget容器或屏幕的范围会出现,一般放入滚动容器中可解
2 image组件的封装
因为官方image组件提供了类似scaleType的属性:fit,当出现图片宽大于高,或高大于宽时,fitWidth或fitHeight就直接替换为BoxFit.cover吧,可以做下兼容,另外因为原生组件没有提供磁盘缓存功能,可以自己实现或直接加载个三方库,比较推荐 flutter_cached_network_image ,然后可以封装自己的imageloader了, 我写了个简易的例子
3 刘海屏适配:用 SafeArea 防止带刘海的屏幕,或者iPhonex 底部bottom 的页面显示异常
class FlutterAlign extends StatelessWidget {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Align(
alignment: Alignment(-1, 1),
child: Container(
child: Text(
"Hello",
),
),
),
);
}
}
复制代码
4 关于toast
flutter作为一款UI框架,使用原则貌似是只要是实现不复杂,原生非不可替代的控件都应该用flutter来做,不过toast这个东西为了保持跟原生界面一致性,还是调用原生吧,不过我遇到的一个小问题是:有个界面有可能需要快速频繁提示toast,而且原生代码中使用的toast是自定义的不排队toast(继承Toast),由于内部机制,快速插入toast队列信息会造成系统等待,短时间不再响应toast弹出,解决方案可以是按钮控制节流(throttle)或防抖(debounce),也可以优化下toast排队机制。
不过最后还是决定用flutter做一个备用吧,网上的多数方案是使用Overlays
Overlays通过把子widget插入到overlay的stack里面, 让依赖它的子widget可以浮在其它的可见元素上面。OverlayEntry可以管理漂浮的widgets。(一个OverlayEntry就是一