前言
在上篇 「Sentry 在百瓶的落地实践」中,笔者主要从方案选型 & 落地实践两个大的方面进行了阐述,本篇文章我们主要对 Sentry 在百瓶的落地实践中遇到的问题进行分析。本文中主要分析的问题主要包括以下几大类(Flutter SDK 版本为 1.22.6,Dart SDK 版本为 2.10.5):
- NoSuchMethodError
- Flutter 官方 bug (已经修复)
- StateError
- NetworkError(DNS)
NoSuchMethodError
问题一
问题描述:
在进行 List 、String 等类型数据判空处理时,直接使用 xxx.isNotEmpty,没有进行判断是否为 null,导致 NoSuchMethodError:The getter isNotEmpty was called null。
问题截图:
<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/860fb4fd0f3148049d2e438d383308a8~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image) <img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/037d0dac18234bd3b73de40a9fdf0fc2~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image” style=“margin: auto” /” style=“margin: auto” />
解决方案:
// 问题代码
if(timeEndList.isNotEmpty){...
}
// 解决方案
static bool isNotNullOrEmpty<E>(Iterable<E> iterable) => iterable != null && iterable.isNotEmpty;
if (IterableUtils.isNotNullOrEmpty(timeEndList)){...
}
在进行判空处理时,需要首先判断是否为 null,然后再使用 isNotEmpty 进行判断,避免这种类型错误,考虑到我们在项目中会使用大量类似判断,所以我们可以对同一类型的数据判断方法进行封装,避免每处使用都要再去写一遍。
问题二
问题描述:
这里是使用了 Future.wait 并发请求多个 API,并且在第二个 API 设置超时,由于第二个 API 请求超时,在后续处理响应时,没有处理空异常判断导致获取不到 code。
问题截图:
<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a5f359fcd57a4152986e8a853b7500fc~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image) <img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f85d7d219b99495980cafd89bac3301d~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image” style=“margin: auto” /” style=“margin: auto” />
解决方案:
// 问题代码
if (res[1].code == HttpCode.ok) {...
}
// 解决方案
if (res[1]?.code == HttpCode.ok) {...
}
在使用了 Future.wait 并发请求多个 API ,如果有设置超时处理,要考虑到 API 请求超时失败的问题尽量避免这种问题发生。
问题三
问题描述:
<