fix theme flashing (#1417)

* fix theme flashing

* remove memo

* use AppState listener
This commit is contained in:
Eric Bailey 2023-09-11 16:39:31 -05:00 committed by GitHub
parent f8c611118e
commit 21371081c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,5 +1,11 @@
import React, {ReactNode, createContext, useContext, useMemo} from 'react' import React, {ReactNode, createContext, useContext} from 'react'
import {TextStyle, useColorScheme, ViewStyle} from 'react-native' import {
AppState,
TextStyle,
useColorScheme,
ViewStyle,
ColorSchemeName,
} from 'react-native'
import {darkTheme, defaultTheme} from './themes' import {darkTheme, defaultTheme} from './themes'
export type ColorScheme = 'light' | 'dark' export type ColorScheme = 'light' | 'dark'
@ -91,14 +97,28 @@ export const ThemeProvider: React.FC<ThemeProviderProps> = ({
children, children,
}) => { }) => {
const colorSchemeFromRN = useColorScheme() const colorSchemeFromRN = useColorScheme()
const [nativeColorScheme, setNativeColorScheme] =
React.useState<ColorSchemeName>(colorSchemeFromRN)
// if theme is 'system', use the device's configured color scheme React.useEffect(() => {
let colorScheme = theme === 'system' ? colorSchemeFromRN : theme const subscription = AppState.addEventListener('change', state => {
const isActive = state === 'active'
const value = useMemo( if (!isActive) return
() => (colorScheme === 'dark' ? darkTheme : defaultTheme),
[colorScheme], setNativeColorScheme(colorSchemeFromRN)
) })
return () => subscription.remove()
}, [colorSchemeFromRN])
const value =
theme === 'system'
? nativeColorScheme === 'dark'
? darkTheme
: defaultTheme
: theme === 'dark'
? darkTheme
: defaultTheme
return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider> return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>
} }