Flutter开发中问题及解决方案

1,数据类型转换时使用tryParse可以减少类型转换异常,在转换异常时,返回默认值

例如

Dart 复制代码
double.tryParse(item.totalfee ?? '0') ?? 0

2,使用setState时,增加mounted判断,减少因为执行耗时任务刷新界面时,当前界面已经退出,出现异常。

Dart 复制代码
        if(mounted){
          setState(() {});
        }

3,使用FocusNode时,需要在dispose时进行销毁。

Dart 复制代码
  FocusNode focus = FocusNode();
 
 @override
  void dispose() {
    super.dispose();
    focus.dispose();
}

4,使用GetXController时尽量采用单例及懒加载方式,可以实现数据共享和内存优化。

  • **Get.put():**不使用控制器实例也会被创建
  • **Get.lazyPut():**懒加载方式创建实例,只有在使用时才创建
  • Get.putAsync(): `Get.put()`的异步版版本
  • Get.create(): 每次使用都会创建一个新的实例

5,使用Completer同步调用,减少callback的使用,使代码逻辑可以更加直观。

Dart 复制代码
  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;
  }

6,使用Dialog时,可以使用await同步等待,获取返回值。

Dart 复制代码
      var result = await DialogUtil.showCommonDialog(context, content: 'Hello Flutter',
          rightCallBack: () {
        Get.back(result: true);
      }, leftCallBack: () {
        Get.back(result: false);
      });

7,使用callback时,可以使用callback?.call();减少非空判断的代码。

Dart 复制代码
    callback?.call(true);

如果有返回值,则可以把需要返回的值,放到call中

8,使用Get页面返回时,如果有返回值的需要做非空判断。

Dart 复制代码
   dynamic arguments = Get.arguments;
    if (arguments != null) {
     }

9,针对耗时操作,可以使用compute进行优化,比如数据解析,单一的耗时操作。

Dart 复制代码
///使用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时,如果顶部出现空白区域无法删除,可以使用如下方式去掉空白。

例如:

Dart 复制代码
MediaQuery.removePadding( context: context, removeTop: true,child)

13,图片加载时可以增加异常监听,处理加载失败的情况,拦截异常。

例如:

Dart 复制代码
 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的方式会出现数组下标越界的情况。

Dart 复制代码
  list.removeWhere((element) => element.isSelected);

16,Dialog中页面返回时,要区分好parentContext和childContext,使用不当会导致Dialog关闭异常。

相关推荐
problc9 小时前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
lqj_本人17 小时前
鸿蒙next选择 Flutter 开发跨平台应用的原因
flutter·华为·harmonyos
lqj_本人20 小时前
Flutter&鸿蒙next 状态管理框架对比分析
flutter·华为·harmonyos
起司锅仔1 天前
Flutter启动流程(2)
flutter
hello world smile1 天前
最全的Flutter中pubspec.yaml及其yaml 语法的使用说明
android·前端·javascript·flutter·dart·yaml·pubspec.yaml
lqj_本人1 天前
Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
flutter·harmonyos
iFlyCai1 天前
极简实现酷炫动效:Flutter隐式动画指南第二篇之一些酷炫的隐式动画效果
flutter
lqj_本人1 天前
Flutter&鸿蒙next 中使用 MobX 进行状态管理
flutter·华为·harmonyos
lqj_本人1 天前
Flutter&鸿蒙next 中的 setState 使用场景与最佳实践
flutter·华为·harmonyos
hello world smile1 天前
Flutter常用命令整理
android·flutter·移动开发·android studio·安卓