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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:45:03