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

Flutter中如何确保Other按钮始终位于Wrap列表末尾?

解决Wrap组件中“Other”按钮始终保持在列表末尾的问题

问题核心在于你使用普通Map存储设施选项,而Dart的普通Map是无序哈希表,遍历键的顺序不固定,导致新增元素后“Other”的位置无法保证;同时你直接遍历整个defaultAmenities的所有元素,没有将“Other”独立出来固定位置。

解决方案

把“Other”从默认设施Map中分离,单独追加到Wrap的children列表末尾,确保无论前面的设施如何新增,它都固定在最后。同时调整amenityCard的参数,直接传入设施名称而非索引,避免依赖Map的遍历顺序。

修改后的代码示例:

  1. 调整默认设施Map,移除“Other”:
Map<String, String> defaultAmenities = {
  'Free Wifi': constants.Assets.wifi,
  'Restroom': constants.Assets.amenitiesRestroom,
  'Cafe': constants.Assets.amenitiesCafe,
};
  1. 重构Wrap组件的children:
Wrap(
  runSpacing: 8,
  children: [
    // 遍历所有默认设施生成卡片
    ...defaultAmenities.keys.map((amenityKey) => amenityCard(amenityKey)).toList(),
    // 单独将Other卡片放在最后
    amenityCard('Other'),
  ],
),
  1. 修改amenityCard方法,直接接收设施名称作为参数:
Widget amenityCard(String amenityKey) {
  return Padding(
    padding: const EdgeInsets.only(right: 6),
    child: GestureDetector(
      onTap: () {
        if (amenityKey == 'Other') {
          setState(() {
            isOther = true;
          });
        } else {
          setState(() {
            if (selectedAmenities.contains(amenityKey)) {
              selectedAmenities.removeWhere((element) => element == amenityKey);
            } else {
              selectedAmenities.add(amenityKey);
            }
          });
        }

        widget.onAmenitiesChanged(selectedAmenities);
      },
      child: Container(
        width: 20 + amenityKey.length * 13,
        alignment: Alignment.center,
        height: 40,
        child: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 4),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              const SizedBox(width: 3),
              Text(
                amenityKey,
                style: TextStyle(
                  color: selectedAmenities.contains(amenityKey)
                      ? constants.Colors.green
                      : Colors.white.withOpacity(0.5),
                  fontFamily: constants.FontFamily.AvenirLtStd,
                  fontWeight: FontWeight.w300,
                  fontSize: 16,
                ),
              ),
            ],
          ),
        ),
      ),
    ),
  );
}

原理说明

  • 将“Other”独立出来放在children的最后,脱离默认设施Map的遍历逻辑,确保它的位置不受新增设施影响。
  • 用设施名称直接作为参数传递给amenityCard,避免依赖Map的索引(索引顺序随Map元素变化而不稳定),代码更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:55:20