内容简介:项目中的一些模块用flutter重新开发后在两次云测和灰度少量渠道后发现了些问题,分为两类:一个是非编译/运行时问题,即dart语法使用错误或widget布局错误使用出现的问题因为这类问题对于所有人几乎都会遇到,不再详细说解决方案,只简单罗列下我遇到的,提醒别人注意即可:
项目中的一些模块用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就是一个层) 复制代码
我贴一个简单实现
import 'package:flutter/material.dart'; class FlutterToast { static OverlayEntry _overlayEntry; //toast靠它加到屏幕上 static bool _showing = false; //toast是否正在showing static DateTime _startedTime; //开启一个新toast的当前时间,用于对比是否已经展示了足够时间 static String _msg; static void toast( BuildContext context, String msg, ) async { assert(msg != null); _msg = msg; _startedTime = DateTime.now(); //获取OverlayState OverlayState overlayState = Overlay.of(context); _showing = true; if (_overlayEntry == null) { _overlayEntry = OverlayEntry( builder: (BuildContext context) => Positioned( //top值,可以改变这个值来改变toast在屏幕中的位置 top: MediaQuery.of(context).size.height * 2 / 3, child: Container( alignment: Alignment.center, width: MediaQuery.of(context).size.width, child: Padding( padding: EdgeInsets.symmetric(horizontal: 80.0), child: AnimatedOpacity( opacity: _showing ? 1.0 : 0.0, //目标透明度 duration: _showing ? Duration(milliseconds: 100) : Duration(milliseconds: 400), child: _buildToastWidget(), ), )), )); overlayState.insert(_overlayEntry); } else { _overlayEntry.markNeedsBuild(); } await Future.delayed(Duration(milliseconds: 2000)); //等待两秒 if (DateTime.now().difference(_startedTime).inMilliseconds >= 2000) { _showing = false; _overlayEntry.markNeedsBuild(); } } static _buildToastWidget() { return Center( child: Card( color: Colors.black, child: Padding( padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 8.0), child: Text( _msg, style: TextStyle( fontSize: 14.0, color: Colors.white, ), ), ), ), ); } } 复制代码
可以根据需要调节UI,让它和你的原生toast保持一致,但是有个问题,它弹出后会被键盘覆盖,由于机制问题,所以暂时貌似还不能解决,也因如此,flutter这种toast默认在中间弹出防止被盖住。
除去UI等异常,另一种就是直接debug或release报错,或者机型适配出现的问题了,多出现在dart VM或SDK中
二、编译运行问题
1[FATAL:flutter/runtime/dart_vm.cc(416)] Error while initializing the Dart VM: Wrong full snapshot version, expected '0c73eb70aa4d30f450273cb424be8c62' found 'eed485c757fba5d731e4054412c99f2e'
问题发生于升级flutter sdk之后,直接run出错,覆盖版本不详,我的是1.3.7升级到1.5和之后的版本,搜索了issue后找到了个方案:
1) removing the content of flutter/bin/cache 2) then running flutter upgrade again 3) then running flutter clean prior to flutter run 复制代码
2 部分红米手机的崩溃
E/flutter: [ERROR:flutter/runtime/dart_vm.cc(259)] VM snapshot must be valid. A/flutter: [FATAL:flutter/shell/common/shell.cc(212)] Check failed: vm. Must be able to initialize the VM. --------- beginning of crash
升级sdk到1.4之后解决
3 cpu架构中so包支持问题
因为是混合开发,flutter作为插件支持原生项目,所以需要支持什么样的cpu架构视原生项目情况而定,我们的平台底层库只支持
ndk { abiFilters 'armeabi' } 复制代码
对于flutter SDK的修改:我们只需要修改android-arm、android-arm-profile和android-arm-release下的flutter.jar,将其中的lib/armeabi-v7a/libflutter.so移动到lib/armeabi/libflutter.so即可:
1 先进入目录 cd $FLUTTER_ROOT/bin/cache/artifacts/engine 2 然后执行 for arch in android-arm android-arm-profile android-arm-release; do pushd $arch cp flutter.jar flutter-armeabi-v7a.jar # 备份 unzip flutter.jar lib/armeabi-v7a/libflutter.so mv lib/armeabi-v7a lib/armeabi zip -d flutter.jar lib/armeabi-v7a/libflutter.so zip flutter.jar lib/armeabi/libflutter.so popd done 复制代码
注:所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件,因此似乎移除其他ABIs的.so文件是一个减少APK大小的好技巧。但事实上并不是:这不只影响到函数库的性能和兼容性,x86设备能够很好的运行ARM类型函数库,但并不保证100%不发生crash,特别是对旧设备。64位设备(arm64-v8a, x86_64, mips64)能够运行32位的函数库,但是以32位模式运行,在64位平台上运行32位版本的ART和Android组件,将丢失专为64位优化过的性能(ART,webview,media等等)。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 源码编译LNMP出现的问题及解决方法
- @vue/cli 项目编译重复命中缓存问题解析
- Visual Studio 如何能够不进行编译就调试 .NET/C# 项目(用于解决大项目编译缓慢的问题)
- Visual Studio 通过修改项目的调试配置文件做到临时调试的时候不要编译(解决大项目编译缓慢问题)
- Visual Studio 如何能够不进行编译就调试 .NET/C# 项目(用于解决大项目编译缓慢的问题)
- Golang编译-ldflags -X 在vendor中不生效的问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。