当前位置: 首页 > news >正文

WHAT - React Native 中 Light and Dark mode 深色模式(黑暗模式)机制

文章目录

  • 一、Light / Dark Mode 的原理
    • 1. 操作系统层
    • 2. React Native 如何获取?
    • 3. 样式怎么跟着变?
  • 二、关键代码示例讲解
    • 代码讲解:
  • 三、自定义主题
  • 四、运行时自动更新
  • 五、核心原理一张图
  • 组件应用例子
    • 最小示例:动态样式
    • 按钮的动态样式
    • 如何封装一套自定义主题
    • 四、如何和 ThemeProvider 配合?
    • 小技巧
    • 总结
  • 总结一句话

这其实是现代移动应用开发中非常常用的功能:自动适配浅色/深色模式(Light / Dark Mode)。

在业内,譬如 React Native + Expo 把这个机制做得非常友好,下面我帮你从原理到代码一步步拆解,让你彻底理解它是如何工作的。

一、Light / Dark Mode 的原理

1. 操作系统层

所有的主流操作系统(Android、iOS、macOS、Windows)都提供了「全局配色方案」设置:

  • 浅色(Light)
  • 深色(Dark)

当用户在系统里选择了一个模式后,操作系统会把这个偏好传递给应用程序


2. React Native 如何获取?

React Native 暴露了一个 hook

const colorScheme = useColorScheme();

这个 hook:

  • 自动监听系统主题
  • 返回 'light''dark'null

例如:

const colorScheme = useColorScheme();
console.log(colorScheme);
// 可能打印:'light' 或 'dark'

一旦系统主题改变(比如用户切换深色模式),React Native 会自动重新渲染你的组件。


3. 样式怎么跟着变?

知道当前主题后,你就可以:

  • 切换颜色
  • 切换主题对象
  • 切换字体或其他样式

Expo Router 的模板里,就是通过 <ThemeProvider> 提供一个全局主题对象:

<ThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
  • 当 colorScheme 是 'dark',使用 DarkTheme
  • 当 colorScheme 是 'light',使用 DefaultTheme

所有内部的组件(如导航、背景色、按钮)就都自动使用对应的颜色配置。


二、关键代码示例讲解

来看你提到的核心代码:

return (<ThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}><Stack><Stack.Screen name="(tabs)" options={{ headerShown: false }} /><Stack.Screen name="+not-found" /></Stack><StatusBar style="auto" /></ThemeProvider>
);

代码讲解:

useColorScheme()

  • 获取系统主题

ThemeProvider

  • 提供全局主题对象
  • 内部的 StackTabDrawer 会自动根据这个 Theme 渲染样式(背景、字体颜色、分隔线等)

DarkThemeDefaultTheme

  • 都是内置的主题对象

  • 定义了:

    • 主色
    • 背景色
    • 文本颜色
    • 边框色
    • 卡片颜色

StatusBar style="auto"

  • 自动根据主题切换状态栏字体颜色(黑色/白色)

三、自定义主题

如果你想扩展自己的配色,可以在 themes.ts 文件定义:

export const MyLightTheme = {...DefaultTheme,colors: {...DefaultTheme.colors,primary: '#1e90ff',background: '#ffffff',text: '#333333',},
};export const MyDarkTheme = {...DarkTheme,colors: {...DarkTheme.colors,primary: '#1e90ff',background: '#000000',text: '#ffffff'
http://www.dtcms.com/a/264751.html

相关文章:

  • 如何在Excel中每隔几行取一行
  • 【PMP】项目管理入门:从基础到环境的体系化拆解
  • 分布式定时任务:xxl-job
  • 苍穹外卖day12--Apache POI导出Excel报表
  • [MIA 2025]CLIP in medical imaging: A survey
  • 多云密钥统一管理实战:CKMS对接阿里云/华为云密钥服务
  • .npmrc和.yarnrc配置文件介绍:分别用于 Node.js 中的 npm(Node Package Manager)和 Yarn 包管理工具
  • oracle集合三嵌套表(Nested Table)学习
  • 【第三章:神经网络原理详解与Pytorch入门】01.神经网络算法理论详解与实践-(1)神经网络预备知识(线性代数、微积分、概率等)
  • 微控制器中的EXTI0(External Interrupt 0)中断是什么?
  • uniapp socket 封装 (可拿去直接用)
  • 可编辑33页PPT | 某材料制造企业工业互联网平台解决方案
  • 云原生环境下部署大语言模型服务:以 DeepSeek 为例的实战教程
  • 6种iOS开发中常用的设计模式
  • Qt designer坑-布局内子控件的顺序错乱
  • 量化交易学习之自动化交易策略 [freqtrade 框架学习] ,常见问题避坑指南!!!!
  • <u>#12288;#8203;</u> HTML5全角空格,自动换行,半角用#32;#8203;
  • Spring AI Advisor RAG使用指南
  • Android Auto即将带来变革
  • AI大模型:从编码助手到流程重构者——软件开发新范式解析
  • 【前端】1 小时实现 React 简历项目
  • 多种方法实现golang中实现对http的响应内容生成图片
  • MySQL间隙锁详解:解决幻读的「隐形守护者」
  • React 学习(2)
  • 03-JS资料
  • 企业需要什么样的远程桌面管理软件?
  • 不引入变量 异或交换的缺点
  • 替代进口SCA7606【智芯微】国产高精度电流传感器 工业新能源电网专用
  • openai-agents记忆持久化(neo4j)
  • WPF学习笔记(21)ListBox、ListView与控件模板