Flutter提示函数体可能返回null但返回类型为非空类型该如何解决?
报错原因
这个报错是Dart空安全校验触发的:你传给then方法的回调函数仅在接口状态码为200的分支返回了List<Doctor>类型的值,进入statusCode非200的分支时,仅执行了弹窗方法,没有返回任何值,等同于返回null。而你要把这个then的返回值赋值给doctors变量,该变量的声明是不可为空的列表类型,和可能返回null的结果冲突,因此触发报错。
解决方法
你可以根据业务需求选择以下任意一种方案:
方案1:补全所有分支的返回逻辑(推荐)
你可以优先统一使用async/await写法替换混用await+then的逻辑,可读性更高,也更容易排查分支遗漏问题:
Future<void> getDoctorsFromApi() async { try { final list = await findAllDoctor(); List<int> ids = list.map((e) => e.syncedId).toList(); final response = await DoctorApi.getDoctors(ids); if (response.statusCode == 200) { Iterable list = json.decode(response.body); doctors = list.map((model) => Doctor.fromJson(model)).toList(); } else { _showMyDialog(); // 接口请求失败时根据业务需求赋值默认值,这里以空列表为例 doctors = []; } setState(() { insertDoctors(database!); }); } catch (e) { // 额外捕获请求过程中的异常,避免APP崩溃 _showMyDialog(); doctors = []; setState(() {}); } }
如果你要保留原有的then写法,只需要在else分支补全返回值即可:
doctors = await DoctorApi.getDoctors(ids).then((response) { if (response.statusCode == 200) { Iterable list = json.decode(response.body); return list.map((model) => Doctor.fromJson(model)).toList(); } else { _showMyDialog(); // 补全返回值 return <Doctor>[]; } });
方案2:调整doctors的变量类型
如果你的业务逻辑允许接口请求失败时doctors为null,可以把doctors的声明改为可空类型:
// 原声明如果是 List<Doctor> doctors; 改为下方的可空声明 List<Doctor>? doctors;
修改后你只需要在else分支返回null即可:
doctors = await DoctorApi.getDoctors(ids).then((response) { if (response.statusCode == 200) { Iterable list = json.decode(response.body); return list.map((model) => Doctor.fromJson(model)).toList(); } else { _showMyDialog(); return null; } });
注意:使用可空类型后,后续所有调用doctors的位置都需要做空安全校验,避免空异常
内容的提问来源于stack exchange,提问作者Dhia Shalabi
相关产品推荐
相关产品推荐

