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

如何为contextMenuBuilder适配深色模式?iOS端SelectableText菜单问题

iOS 下 SelectableText 自定义 ContextMenu 深色模式适配方案

在 iOS 平台使用 contextMenuBuilder 自定义 SelectableText 的菜单时,系统不会自动适配深色模式,需要手动根据当前系统主题调整菜单配色:

  • 先通过 MediaQuery 获取当前设备的亮度模式:

    final brightness = MediaQuery.of(context).platformBrightness;
    final isDarkMode = brightness == Brightness.dark;
    
  • 构建 ContextMenu 时,根据深色/浅色模式设置对应背景色和文字颜色,对齐 iOS 系统默认菜单的视觉风格:

    SelectableText(
      "需要选择的文本内容",
      contextMenuBuilder: (context, editableTextState) {
        final isDark = MediaQuery.of(context).platformBrightness == Brightness.dark;
        
        return AdaptiveTextSelectionToolbar(
          toolbarBuilder: (context, children) {
            return Container(
              decoration: BoxDecoration(
                // 匹配iOS系统菜单的深浅色背景
                color: isDark ? const Color(0xFF3C3C43) : const Color(0xFFF2F2F7),
                borderRadius: BorderRadius.circular(12),
              ),
              padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
              child: Row(
                mainAxisSize: MainAxisSize.min,
                children: children.map((child) {
                  return Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 16),
                    child: DefaultTextStyle(
                      style: TextStyle(
                        color: isDark ? Colors.white : Colors.black,
                        fontSize: 16,
                      ),
                      child: child,
                    ),
                  );
                }).toList(),
              ),
            );
          },
          anchors: editableTextState.contextMenuAnchors,
          children: editableTextState.contextMenuButtonItems.map((item) {
            return TextButton(
              onPressed: item.onPressed,
              child: Text(item.label),
            );
          }).toList(),
        );
      },
    )
    
  • 更简便的系统色值适配方式:
    直接使用 Cupertino 系列颜色,它们会自动跟随系统模式变化,无需手动判断:

    // 背景色自动适配深浅模式
    color: CupertinoColors.systemBackground.resolveFrom(context),
    // 文字色自动适配深浅模式
    style: TextStyle(color: CupertinoColors.label.resolveFrom(context))
    

通过以上方式,自定义的文本选择菜单就能完美匹配 iOS 的深色/浅色模式显示效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:32:35