fix theme flashing (#1417)
* fix theme flashing * remove memo * use AppState listener
This commit is contained in:
parent
f8c611118e
commit
21371081c6
1 changed files with 28 additions and 8 deletions
|
@ -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>
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue