expo-router 黑暗模式
Expo Router 是一个用于 React Native 应用程序的路由库,它可以帮助你轻松地管理应用程序中的导航和路由。要在使用 Expo Router 的应用程序中实现黑暗模式,你可以按照以下步骤进行操作:
安装必要的依赖:
确保你已经安装了 expo
和 react-navigation
相关的依赖。如果还没有安装,可以使用以下命令进行安装:
expo install react-navigation react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view
设置主题:
创建一个文件来定义你的主题,比如 themes.js
:
// themes.js
export const lightTheme = {
dark: false,
colors: {
primary: '#ffffff',
background: '#ffffff',
card: '#ffffff',
text: '#000000',
border: '#cccccc',
notification: '#ff453a',
},
};
export const darkTheme = {
dark: true,
colors: {
primary: '#000000',
background: '#000000',
card: '#1c1c1c',
text: '#ffffff',
border: '#272727',
notification: '#ff453a',
},
};
使用 react-navigation
的 ThemeProvider
:
在你的应用程序入口文件中(通常是 App.js
或 index.js
),使用 ThemeProvider
来应用主题。
// App.js
import React, { useState, useEffect } from 'react';
import { NavigationContainer, DefaultTheme, DarkTheme } from '@react-navigation/native';
import { lightTheme, darkTheme } from './themes';
import { useColorScheme } from 'react-native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
const Stack = createNativeStackNavigator();
function App() {
const scheme = useColorScheme();
const [theme, setTheme] = useState(scheme === 'dark' ? darkTheme : lightTheme);
useEffect(() => {
setTheme(scheme === 'dark' ? darkTheme : lightTheme);
}, [scheme]);
return (
<NavigationContainer theme={theme}>
<Stack.Navigator>
{/* 你的屏幕组件 */}
</Stack.Navigator>
</NavigationContainer>
);
}
export default App;
在组件中使用主题:
你可以在组件中使用 useTheme
钩子来获取当前的主题,并根据主题来调整组件的样式。
// ExampleComponent.js
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import { useTheme } from '@react-navigation/native';
const ExampleComponent = () => {
const { colors } = useTheme();
return (
<View style={[styles.container, { backgroundColor: colors.background }]}>
<Text style={{ color: colors.text }}>Hello, World!</Text>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
});
export default ExampleComponent;
通过以上步骤,你可以在使用 Expo Router 的 React Native 应用程序中实现黑暗模式。你可以根据需要进一步自定义主题和样式。