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

如何为列表中的可复用Widget创建独立的GetxController?

解决Getx列表项共享Controller的问题

你的核心问题是复用了同一个GetxController实例,导致所有列表项互相干扰,完全不需要退回到StatefulWidget,给每个列表项创建独立的Controller实例即可解决。

1. 定义单个列表项的Controller

先写一个专门对应单个列表项的Controller类:

class ItemController extends GetxController {
  RxString a = 'aaa'.obs;

  void updateA(String name) {
    a.value = name;
  }
}

2. 为每个列表项初始化独立实例

在构建列表时,给每个Item都创建专属的Controller实例,避免共用同一个:

// 假设你有一个name列表数据源
final List<String> nameList = ['张三', '李四', '王五'];

ListView.builder(
  itemCount: nameList.length,
  itemBuilder: (context, index) {
    // 每个列表项单独初始化Controller
    final itemController = ItemController();
    // 给当前项设置对应的name
    itemController.updateA(nameList[index]);
    
    return Obx(() {
      return Text(itemController.a.value);
    });
  },
)

如果需要更精细的生命周期管理(比如Controller需要跨页面复用),可以通过tag区分不同实例:

ListView.builder(
  itemCount: nameList.length,
  itemBuilder: (context, index) {
    final tag = 'item_$index';
    // 用tag标记每个独立的Controller实例
    final itemController = Get.put(ItemController(), tag: tag);
    itemController.updateA(nameList[index]);
    
    return Obx(() {
      return Text(itemController.a.value);
    });
  },
)

注意:使用tag时,建议在列表项销毁时调用Get.delete<ItemController>(tag: 'item_$index'),避免不必要的内存泄漏。

3. 原代码报错原因

你之前的代码共用了同一个getxA实例,每次列表项的Obx刷新都会调用updateA,导致所有项的a被覆盖成当前index的name,自然会出现冲突。每个列表项使用独立的Controller后,状态完全隔离,就不会有这个问题了。

内容的提问来源于stack exchange,提问作者chichi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:10:36