You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:07:48