如何为contextMenuBuilder适配深色模式?iOS端SelectableText菜单问题
在 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
相关产品推荐
相关产品推荐

