React Native Switch组件返回重入后状态重置问题求助
React Native明暗模式切换Switch组件状态重置问题
我在React Native中使用Switch组件,结合State、Context和事件监听器实现明暗模式切换,但返回重入该页面时,Switch组件的状态会重置,遇到了网上没见过的异常行为。
Switch所在页面代码
import React, { useState, useContext } from 'react'; import { Text, TouchableOpacity, SafeAreaView, Switch } from 'react-native'; import { useNavigation } from '@react-navigation/core'; import theme from '../assets/styles/theme'; import ThemeContext from '../context/ThemeContext'; import { StatusBar } from 'expo-status-bar'; import { EventRegister } from 'react-native-event-listeners'; const Settings = () => { const navigation = useNavigation(); const colors: any = useContext(ThemeContext); const [mode, setMode] = useState(false); return ( <SafeAreaView style={[theme.container, { backgroundColor: colors.background }]} > <Switch onValueChange={(value) => { setMode((value) => !value); EventRegister.emit('changeTheme', value); }} value={mode} /> <TouchableOpacity onPress={() => navigation.navigate('Home')} style={[theme.button, { backgroundColor: colors.button }]} > <Text style={[theme.buttonText, { color: colors.buttonText }]}> Back </Text> </TouchableOpacity> <StatusBar style={mode === false ? 'dark' : 'light'}></StatusBar> </SafeAreaView> ); }; export default Settings;
App.tsx事件监听器代码
import React, { useState, useEffect } from 'react'; import { NavigationContainer } from '@react-navigation/native'; import AppNavigator from './navigation/AppNavigator'; import { EventRegister } from 'react-native-event-listeners'; import ThemeContext from './context/ThemeContext'; import colors from './assets/colors/colors'; export default function App() { const [mode, setMode] = useState(false); useEffect(() => { let eventListener: string = EventRegister.addEventListener( 'changeTheme', (data) => { setMode(data); } ); return () => { EventRegister.removeEventListener(eventListener); }; }); return ( <ThemeContext.Provider value={mode === true ? colors.dark : colors.light}> <NavigationContainer> <AppNavigator /> </NavigationContainer> </ThemeContext.Provider> ); }
附异常行为演示(动图)
我是React新手,希望能得到帮助,谢谢。
编辑:临时解决办法
根据建议,我找到了一个可行的临时方案,虽然之后可能会重构,但确实解决了Switch状态重置的问题,有相同问题的开发者可以参考:
import React, { useState, useContext } from 'react'; import { Text, TouchableOpacity, SafeAreaView, Switch } from 'react-native'; import { useNavigation } from '@react-navigation/core'; import theme from '../assets/styles/theme'; import ThemeContext from '../context/ThemeContext'; import { StatusBar } from 'expo-status-bar'; import { EventRegister } from 'react-native-event-listeners'; import colors from '../assets/colors/colors'; const Settings = () => { const navigation = useNavigation(); const scheme: any = useContext(ThemeContext); let aux = scheme; aux === colors.dark ? (aux = true) : (aux = false); const [mode, setMode] = useState(aux); return ( <SafeAreaView style={[theme.container, { backgroundColor: scheme.background }]} > <Switch onValueChange={(value) => { setMode((value) => !value); EventRegister.emit('changeTheme', value); }} value={aux} /> <TouchableOpacity onPress={() => navigation.navigate('Home')} style={[theme.button, { backgroundColor: scheme.button }]} > <Text style={[theme.buttonText, { color: scheme.buttonText }]}> Back </Text> </TouchableOpacity> <StatusBar style={mode === false ? 'dark' : 'light'}></StatusBar> </SafeAreaView> ); }; export default Settings;
内容的提问来源于stack exchange,提问作者OPato
相关产品推荐
相关产品推荐

