You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:51:02