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

Flutter影院选座功能如何禁用部分已预订座位对应的Checkbox控件

实现方案

你可以通过增加已预订座位的判定逻辑实现部分禁用,步骤如下:

  • 提前维护已预订座位的数据源
    使用Set存储已被预订的座位索引,数据可从后端接口获取,示例定义:
// 存储已预订座位的index集合,示例值仅作演示
Set<int> bookedSeatIndexes = {2, 7, 15, 36, 89, 120};
  • 生成Checkbox时增加判断逻辑
    生成每个Checkbox实例时,判断当前索引是否属于已预订集合,是则将onChanged设为null即可禁用对应控件。你原有代码中column计算逻辑存在错误(index % 200等价于直接返回index),已同步修正,完整修改后代码如下:
Positioned(
  top: 45,
  left: 16,
  right: 16,
  child: GridView.count(
    shrinkWrap: true,
    crossAxisCount: 20,
    mainAxisSpacing: 2,
    crossAxisSpacing: 2,
    children: List.generate(200, (index) {
      // 修正列计算逻辑:crossAxisCount为20时,列数为index对20取余
      int column = index % 20;
      // 可选:已预订座位默认标记为已选,可根据产品需求调整
      bool isBooked = bookedSeatIndexes.contains(index);
      return Theme(
        data: ThemeData(
          primarySwatch: Colors.red,
          // 可选:已预订座位未选中状态显示灰色,可自定义样式
          unselectedWidgetColor: isBooked ? Colors.grey : Colors.blueGrey,
        ),
        child: Checkbox(
            checkColor: Colors.white,
            // 可选:已预订座位默认显示已勾选状态
            value: isBooked ? true : widget.seat![widget.index!][column],
            // 核心逻辑:已预订的座位onChanged设为null,直接禁用
            onChanged: isBooked ? null : (selected) {
              setState(() {
                if (widget.seat![widget.index!][column] == false) {
                  widget.seat![widget.index!][column] = true;
                  seat_select++;
                } else if (widget.seat![widget.index!][column] == true) {
                  widget.seat![widget.index!][column] = false;
                  seat_select--;
                }
              });
            }),
      );
    }),
  ),
)
  • 额外优化说明
    如果需要区分已预订、可选、已选中三种状态的样式,可以分别对isBooked为true的情况自定义checkColor、activeColor等属性即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:36:03