Flutter动态生成列表并在UI展示时遭遇类型错误:Expected a value of type 'List', but got one of type '({bool growable}) => List',求排查指导
问题排查与解决方案
嘿,我帮你找到了问题所在,这个错误其实是个很容易犯的小疏忽!
核心错误原因
你遇到的 Expected a value of type 'List', but got one of type '({bool growable}) => List' 错误,根源在于你调用toList的时候忘记加括号了!
toList() 是一个方法,需要通过括号来执行它并返回实际的List实例;而你写的.toList只是引用了这个方法本身,并没有执行,这就导致赋值给items的是方法对象而非List对象,直接触发了类型不匹配的报错。
修正后的代码
1. 数据解析部分的修正
首先把解析列表的代码改对,同时优化重复解析的冗余操作:
if (response.statusCode == 200) { // 关键修正:给toList加上括号,执行方法获取List实例 List items = jsonDecode(response.body)['result'].toList(); // 用map简化循环,替代原有的for循环(更简洁) List<Contract> contractResults = items.map((item) => Contract.fromJson(item)).toList(); // 记得返回这个结果,让FutureBuilder能拿到数据 return contractResults; } else { // 处理请求失败的情况,抛出异常供FutureBuilder捕获 throw Exception('Failed to load contracts'); }
原代码里每次循环都重复调用
jsonDecode(response.body)['result'][i]完全没必要,直接用已经解析好的items[i]就行,用map方法还能进一步简化代码。
2. FutureBuilder部分的修正
你的列表展示代码还有几个小问题:比如用snapshot.data != ""判断空列表(List和字符串没法直接比较),缺少加载中、错误状态的处理,可能导致UI返回null报错。修正后:
child: FutureBuilder<List<Contract>>( future: futureAlbum, builder: (context, snapshot) { // 处理加载中状态,展示加载指示器 if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } // 处理请求错误,展示错误信息 if (snapshot.hasError) { return Center(child: Text('加载失败: ${snapshot.error}')); } // 处理数据存在且非空的情况 if (snapshot.hasData && snapshot.data!.isNotEmpty) { return ListView.builder( itemCount: snapshot.data!.length, itemBuilder: (BuildContext context, int index) { return Text(snapshot.data![index].contractId); }, ); } // 兜底:没有数据时的提示 return const Center(child: Text('暂无合同数据')); }, )
额外提示
- 如果你用的是空安全版本的Flutter,记得在访问
snapshot.data时做好空判断(上面的代码已经通过hasData和!处理了) - 用
map方法转换列表是Dart中更简洁的写法,能替代繁琐的for循环,推荐使用
内容的提问来源于stack exchange,提问作者Prasanna Palaniraj
相关产品推荐
相关产品推荐

