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

Flutter列表项独立增减:点击对应按钮仅修改当前项数量

解决列表项点击按钮仅修改对应项数量的问题

问题根源

你当前用了全局的ticket变量,所有列表项都绑定这个变量,所以点击任何按钮都会同步修改所有项的显示值。要实现单独控制,得让每个列表项自己维护数量属性。


分步解决

  1. 修改Painting数据模型
    给Painting类新增一个ticket属性,用来存储每幅画的单独数量,默认值设为0:
class Painting {
  final String? title;
  final String? subTitle;
  final String? artSubtitle;
  final String? artTitle;
  final String? imageAsset;
  int ticket; // 新增:当前项的数量

  Painting({
    this.title,
    this.subTitle,
    this.artSubtitle,
    this.artTitle,
    this.imageAsset,
    this.ticket = 0, // 默认数量为0
  });
}
  1. 初始化列表(无需额外修改,默认ticket为0)
List<Painting> paintingList = [
  Painting(
    title: 'Giacomo Amiconi',
    subTitle: 'Jacob and Rachel',
    artSubtitle: 'National Museum, Warsaw',
    artTitle: '18th Century',
    imageAsset: 'https://upload.wikimedia.org/wikipedia/commons/0/0a/Amigoni_Jacob_and_Rachel.jpg',
  ),
];
  1. 修改UI部分的显示与点击逻辑
    删掉全局的int ticket = 0;,然后调整列表项的显示和点击事件:
return Expanded(
  child: ListView.separated(
    separatorBuilder: (BuildContext context, int index) {
      return SizedBox(height: 10);
    },
    scrollDirection: Axis.vertical,
    shrinkWrap: true,
    itemCount: paintingList.length,
    itemBuilder: (context, index) {
      Painting model = paintingList[index];
      return Padding(
        padding: const EdgeInsets.all(8.0),
        child: Card(
            elevation: 5,
            child: Column(
              children: [
                ListTile(
                  leading: Padding(
                    padding: const EdgeInsets.only(top: 8),
                    child: Icon(Icons.brush, color: orange),
                  ),
                  title: Text(
                    model.title!,
                    style: artTitle,
                  ),
                  subtitle: Text(
                    model.subTitle!,
                    style: artSubtitle,
                  ),
                ),
                Image.network(
                  model.imageAsset!,
                ),
                ListTile(
                  title: Text(
                    model.artTitle!,
                    style: artTitle,
                  ),
                  subtitle: Text(
                    model.artSubtitle!,
                    style: artSubtitle,
                  ),
                  trailing: Text('${model.ticket}'), // 显示当前项的数量
                ),
                Row(
                  children: [
                    Container(
                        child: GestureDetector(
                            onTap: () {
                              setState(() {
                                // 仅修改当前点击项的数量
                                paintingList[index].ticket++;
                              });
                            },
                            child: Icon(Icons.add)))
                  ],
                )
              ],
            )),
      );
    },
  ),
);

核心逻辑

每个Painting实例独立维护自己的ticket值,点击按钮时只修改对应索引项的属性,这样就能实现单独控制每个列表项的数量变化,不会再出现同步修改的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:36:00