Flutter实现实验室-测试联动下拉框时出现Text组件非空断言错误
问题原因
报错核心是你在页面渲染时给Text组件传入了空值(null),结合你提供的代码,触发问题的场景有三个:
- 变量初始化时未设置默认值,
allLabList、testList、_myLab、_myTest初始状态都是null,页面首次渲染时还没等到异步接口返回数据,直接把这些null值传给了Text组件 - 接口返回的数据为空时,你直接把
data['Partner']或data['Data']的null值赋值给列表变量,后续渲染时触发报错 - 下拉选项中展示Lab/Test名称时,对应字段未做非空处理,直接传入
Text组件
修复方案
1. 给所有变量添加初始默认值,避免初始状态为null
// 初始化时直接赋值空数组/空字符串 List allLabList = []; String _myLab = ''; List testList = []; String _myTest = '';
2. 接口返回数据时添加非空兜底判断
赋值时用??运算符设置兜底值,避免接口返回null时变量被赋值为null:
// Lab接口赋值逻辑 setState(() { allLabList = data['Partner'] ?? []; }); // Test接口赋值逻辑 setState(() { testList = data['Data'] ?? []; });
3. 构建Text组件时统一添加非空兜底
所有给Text传值的位置都添加默认值兜底,比如:
// 展示选中的Lab Text(_myLab.isEmpty ? '请选择Lab' : _myLab) // 下拉选项展示Lab名称,假设Lab名称字段是name,根据实际字段调整 Text(labItem['name'] ?? '')
4. 可选优化(可规避其他潜在报错)
你当前的异步方法同时用了await和then,属于冗余写法,可以简化;另外高版本的http包要求请求地址传入Uri类型,不能直接传字符串,调整后写法如下:
Future<void> _getLabList() async { final response = await http.post(Uri.parse(allLabInfoUrl), body: {}); var data = json.decode(response.body); setState(() { allLabList = data['Partner'] ?? []; }); } Future<void> _getTestList() async { // 先判断选中的Lab不为空再发请求,避免传空参数 if (_myLab.isEmpty) return; final response = await http.post(Uri.parse(allTestInfoUrl), body: {"TestId": _myLab}); var data = json.decode(response.body); setState(() { testList = data['Data'] ?? []; }); }
内容的提问来源于stack exchange,提问作者Toujo
相关产品推荐
相关产品推荐

