Flutter中FutureBuilder渲染列表项时部分距离显示null问题排查
FutureBuilder的Future在build方法内创建,导致重复执行与状态丢失
每次build方法执行时,都会重新调用getCurrentLocation()创建新的Future实例,FutureBuilder会重新发起异步请求。当列表滚动触发widget重建时,之前的异步请求可能被中断,新请求尚未完成时snapshot.data就是null,从而显示null。强制解包可能为空的字段,引发潜在异常
代码中使用product.itemLocation!强制解包,如果某个商品的itemLocation本身是null,会直接触发空指针异常;即使itemLocation不为null,若其lat或lng为null/非数字格式,执行double.parse(product.itemLocation!.lat.toString())时会抛出格式异常,导致Future执行失败,最终snapshot.data为null。未处理定位失败的异常场景
Geolocator.getCurrentPosition()可能因定位权限未授予、设备定位关闭、信号弱等原因抛出异常,此时Future会进入错误状态,但代码中未处理snapshot.hasError的情况,直接显示snapshot.data,自然会出现null。冗余的参数转换操作存在风险
position.latitude本身就是double类型,无需先转字符串再用double.parse转换。这种冗余操作可能因字符串格式问题(如科学计数法、空字符串)引发解析异常,导致距离计算失败,最终返回的Future无法提供有效数据,显示null。
内容的提问来源于stack exchange,提问作者David S.

