Flutter中initState()内完成API调用后如何更新列表
问题修复方案
你代码里存在2个核心错误导致列表无法正常赋值:
- 变量名冲突:for循环遍历的临时变量名和你定义的ItemsModel实例变量名都是
item,作用域覆盖导致解析后的模型数据无法被正确添加到列表 - 不合理的setState调用:在循环内每次添加元素都触发setState,会导致多次不必要的组件重绘
另外还有两个容易忽略的必填规范问题:
- State的
initState方法必须调用super.initState(),你原来的代码漏了这行,可能导致状态监听异常 - 新版本的http包要求
get方法传入Uri类型参数,如果你直接传字符串url会报错,需要用Uri.parse(url)做转换
修正后完整代码
class _ItemsWidgetState extends State<ItemsWidget> { List<ItemsModel> itemsList = []; @override void initState() { super.initState(); fetchItems(); } Future<void> fetchItems() async { final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { final fetchedItems = json.decode(response.body) as List; // 先批量处理所有数据 List<ItemsModel> tempList = []; for (var itemJson in fetchedItems) { ItemsModel item = ItemsModel.fromJson(itemJson); tempList.add(item); } // 一次性更新状态触发重绘 setState(() { itemsList = tempList; }); } else { throw Exception('Failed to load items'); } } @override Widget build(BuildContext context) { // 可按需添加加载状态,避免首次build时空列表的视觉异常 if (itemsList.isEmpty) { return const Center(child: CircularProgressIndicator()); } // 替换为你自己的列表渲染逻辑 return ListView.builder( itemCount: itemsList.length, itemBuilder: (context, index) { return ListTile(title: Text(itemsList[index].你的字段名)); }, ); } }
内容的提问来源于stack exchange,提问作者dianesis
相关产品推荐
相关产品推荐

