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

Flutter:如何更改选中的PopupMenu菜单项背景颜色?

修改Flutter PopupMenu选中菜单项的背景颜色

要修改PopupMenu选中项的背景颜色,有两种常用实现方式,可根据需求选择:

方法一:通过Theme统一设置样式

适合全局或局部统一PopupMenu风格的场景,一次设置即可应用到所有菜单项:

Theme(
  data: Theme.of(context).copyWith(
    popupMenuTheme: PopupMenuThemeData(
      color: Colors.white, // 菜单整体背景色
      selectedTileColor: const Color(0xffE0F2FE), // 选中项的背景色(匹配你示例中的浅蓝色效果)
      selectedItemColor: Colors.black, // 选中项的文字颜色
    ),
  ),
  child: PopupMenuButton(
    icon: const Icon(
      Icons.swap_vert,
      size: 26,
      color: Color(0xffffffff),
    ),
    itemBuilder: (context) {
      return [
        PopupMenuItem(
          value: 0,
          child: Text(
            "Date",
            style: GoogleFonts.poppins(
              color: const Color(0xff000000),
              fontSize: 14,
              fontWeight: FontWeight.w500,
              letterSpacing: 0.3,
            ),
          ),
        ),
        const PopupMenuItem<int>(
          value: 1,
          child: Text("Settings"),
        ),
        const PopupMenuItem<int>(
          value: 2,
          child: Text("Logout"),
        ),
      ];
    },
    onSelected: (value) {},
  ),
)

方法二:单独控制每个PopupMenuItem(支持保留选中状态)

如果需要点击后保持选中项的高亮,或者给不同项设置不同样式,可通过selected属性和selectedTileColor实现:

首先在State类中定义变量记录选中项:

int? _selectedMenuItem;

然后修改PopupMenuButton实现:

PopupMenuButton(
  icon: const Icon(
    Icons.swap_vert,
    size: 26,
    color: Color(0xffffffff),
  ),
  itemBuilder: (context) {
    return [
      PopupMenuItem(
        value: 0,
        selected: _selectedMenuItem == 0,
        selectedTileColor: const Color(0xffE0F2FE),
        child: Text(
          "Date",
          style: GoogleFonts.poppins(
            color: _selectedMenuItem == 0 ? Colors.black : const Color(0xff000000),
            fontSize: 14,
            fontWeight: FontWeight.w500,
            letterSpacing: 0.3,
          ),
        ),
      ),
      PopupMenuItem<int>(
        value: 1,
        selected: _selectedMenuItem == 1,
        selectedTileColor: const Color(0xffE0F2FE),
        child: Text("Settings"),
      ),
      PopupMenuItem<int>(
        value: 2,
        selected: _selectedMenuItem == 2,
        selectedTileColor: const Color(0xffE0F2FE),
        child: Text("Logout"),
      ),
    ];
  },
  onSelected: (value) {
    setState(() {
      _selectedMenuItem = value;
    });
  },
)

补充说明

  • 方法一的selectedTileColor会自动作用于所有选中项,无需单独配置每个PopupMenuItem;
  • 方法二通过setState更新选中状态,能让用户直观看到当前选中的菜单项;
  • 可根据UI需求调整selectedTileColor的颜色值,适配设计风格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:47:32