赞
踩
1,数据类型转换时使用tryParse可以减少类型转换异常,在转换异常时,返回默认值
例如
double.tryParse(item.totalfee ?? '0') ?? 0
2,使用setState时,增加mounted判断,减少因为执行耗时任务刷新界面时,当前界面已经退出,出现异常。
- if(mounted){
- setState(() {});
- }
3,使用FocusNode时,需要在dispose时进行销毁。
- FocusNode focus = FocusNode();
-
- @override
- void dispose() {
- super.dispose();
- focus.dispose();
- }
4,使用GetXController时尽量采用单例及懒加载方式,可以实现数据共享和内存优化。
5,使用Completer同步调用,减少callback的使用,使代码逻辑可以更加直观。
- Future<bool> login(String userName,String password) async {
- var completer = new Completer<bool>();
- var params = SplayTreeMap<String, dynamic>();
- params['userName'] = userName;
- params['password'] = password;
- LoginVM.Login(params, (data) async {
- if (data != null && data.isNotEmpty) {
- completer.complete(true);
- }else{
- completer.complete(false);
- }
- }, fail: (code, msg) {
- completer.complete(false);
- });
- return await completer.future;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
6,使用Dialog时,可以使用await同步等待,获取返回值。
- var result = await DialogUtil.showCommonDialog(context, content: 'Hello Flutter',
- rightCallBack: () {
- Get.back(result: true);
- }, leftCallBack: () {
- Get.back(result: false);
- });
7,使用callback时,可以使用callback?.call();减少非空判断的代码。
callback?.call(true);
如果有返回值,则可以把需要返回的值,放到call中
8,使用Get页面返回时,如果有返回值的需要做非空判断。
- dynamic arguments = Get.arguments;
- if (arguments != null) {
- }
9,针对耗时操作,可以使用compute进行优化,比如数据解析,单一的耗时操作。
- ///使用compute快速创建Isolate
- var allAreaList = await compute(FileUtils.readFileContent,file);
-
- ///耗时任务
- static Future<List<AreaInfo>> readFileContent(File file) async {
- String fileContent = await file.readAsString();
- if (fileContent.isNotEmpty) {
- List<dynamic> list = json.decode(fileContent);
- return list.map((e) => AreaInfo.fromDBJson(e)).toList();
- }else{
- return [];
- }
- }
10,不要在initState中执行耗时的逻辑,会影响页面载入时间。
注:因为Flutter中默认单线程的,而initState作为一个页面的入口,如果大量同步耗时操作则会影响页面载入渲染的速度。
11,使用策略模式优化if/else的逻辑。
12,使用ListView时,如果顶部出现空白区域无法删除,可以使用如下方式去掉空白。
例如:
MediaQuery.removePadding( context: context, removeTop: true,child)
13,图片加载时可以增加异常监听,处理加载失败的情况,拦截异常。
例如:
- var image = Image.file(File(filePath),
- fit: BoxFit.cover,
- width: MediaQuery.of(context).size.width,
- height: MediaQuery.of(context).size.height);
- var resolve = image.image.resolve(ImageConfiguration.empty);
- resolve.addListener(ImageStreamListener((_, __) {
- //加载成功
- }, onError: (Object exception, StackTrace? stackTrace) {
- debugPrint('图片加载失败');
- }));
- return image;
14,使用缓存目录时,优先使用await getApplicationSupportDirectory() 对应android中的files目录,getTemporaryDirectory目录下的资源会在内存不足时被清理掉。
15,Dart中的List删除元素时推荐使用removeWhere的方式,使用removeAt的方式会出现数组下标越界的情况。
list.removeWhere((element) => element.isSelected);
16,Dialog中页面返回时,要区分好parentContext和childContext,使用不当会导致Dialog关闭异常。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。