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

Flutter中列表内Widget调用setState无法更新主组件状态问题

问题根因

你提前将所有列表项的ListTile预构建完成,存储在_iteamswigitcall列表中,这些Widget创建时绑定的是当时的_bonestoiteams对应位置的数值。后续调用setState修改_bonestoiteams的值时,已经生成好的ListTile不会自动重新构建,所以显示的永远是初始值,即使用ListView.builder返回预存的Widget也无法解决问题。

解决方案

删掉预存Widget的_iteamswigitcall列表,不要提前构建列表项,改为在build阶段动态生成列表项,每次setState后都会用最新的数值重新构建列表项,就能正常刷新显示。

步骤1:调整新增项的逻辑

原来的constractor方法不需要再构建ListTile存入列表,仅维护数据列表即可:

void addNewItem() async {
  // 这里按你的业务逻辑给_silectediteams添加对应的项
  // _silectediteams.add(新增的项名称);
  _bonestoiteams.add(0);
  // 调用setState触发刷新
  setState(() {});
}

步骤2:修改build中的列表渲染逻辑

把原来渲染_iteamswigitcall的部分替换为动态构建的代码:

ListView.builder(
  physics: NeverScrollableScrollPhysics(),  
  shrinkWrap: true, 
  primary: false, 
  itemCount: _silectediteams.length,
  itemBuilder: (context, index) {
    return ListTile(
      trailing: Row(
        mainAxisSize: MainAxisSize.min,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          IconButton(
            onPressed: () {
              setState(() {
                _bonestoiteams[index] = _bonestoiteams[index] + 1;
              });
            },
            icon: Icon(Icons.add),
            color: Colors.green,
          ),
          Text(
            _bonestoiteams[index].toString(),
            textAlign: TextAlign.start,
            textDirection: TextDirection.rtl,
            style: TextStyle(
                fontSize: 14, color: Colors.black, fontWeight: FontWeight.bold),
          ),
          IconButton(
            onPressed: () => setState(() {
              // 修正原代码中减按钮也执行+1的逻辑错误
              if(_bonestoiteams[index] > 0) {
                _bonestoiteams[index] = _bonestoiteams[index] - 1;
              }
            }),
            icon: Icon(Icons.remove),
            color: Colors.red,
          ),
        ],
      ),
      leading: LocalData.iteams_img_1[LocalData.iteams_trade_name
                  .indexOf(_silectediteams[index])] ==
              ''
          ? Image(
              fit: BoxFit.cover,
              image: AssetImage('assets/img/medication.png'),
              height: 60,
              width: 60,
            )
          : Image(
              fit: BoxFit.cover,
              image: FileImage(File(LocalData.iteams_img_1[LocalData
                  .iteams_trade_name
                  .indexOf(_silectediteams[index])])),
              height: 60,
              width: 60,
            ),
      title: Text(
        _silectediteams[index].toString(),
        textAlign: TextAlign.start,
        style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
      ),
    );
  }
)

注意事项

  • Flutter的状态更新遵循数据驱动UI的原则,不要预构建静态Widget存储,要通过数据动态生成UI,状态变化时UI才会同步更新。
  • 原代码中减号按钮的点击逻辑也是执行+1操作,属于业务逻辑错误,上述代码已经修正。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:15:04