内容简介:项目中的一些模块用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中不生效的问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First JavaScript Programming
Eric T. Freeman、Elisabeth Robson / O'Reilly Media / 2014-4-10 / USD 49.99
This brain-friendly guide teaches you everything from JavaScript language fundamentals to advanced topics, including objects, functions, and the browser’s document object model. You won’t just be read......一起来看看 《Head First JavaScript Programming》 这本书的介绍吧!