diff --git a/packages/rn-tester/js/examples/Appearance/AppearanceExample.js b/packages/rn-tester/js/examples/Appearance/AppearanceExample.js
index 9272c6ab6c..e330ae2954 100644
--- a/packages/rn-tester/js/examples/Appearance/AppearanceExample.js
+++ b/packages/rn-tester/js/examples/Appearance/AppearanceExample.js
@@ -9,47 +9,36 @@
*/
import * as React from 'react';
+import {useState, useEffect} from 'react';
import {Appearance, Text, useColorScheme, View} from 'react-native';
import type {AppearancePreferences} from 'react-native/Libraries/Utilities/NativeAppearance';
-import type {EventSubscription} from 'react-native/Libraries/vendor/emitter/EventEmitter';
import {RNTesterThemeContext, themes} from '../../components/RNTesterTheme';
-class ColorSchemeSubscription extends React.Component<
- {...},
- {colorScheme: ?string, ...},
-> {
- _subscription: ?EventSubscription;
+function ColorSchemeSubscription() {
+ const [colorScheme, setScheme] = useState(Appearance.getColorScheme());
- state: {colorScheme: ?string, ...} = {
- colorScheme: Appearance.getColorScheme(),
- };
-
- componentDidMount() {
- this._subscription = Appearance.addChangeListener(
+ useEffect(() => {
+ const subscription = Appearance.addChangeListener(
(preferences: AppearancePreferences) => {
- const {colorScheme} = preferences;
- this.setState({colorScheme});
+ const {colorScheme: scheme} = preferences;
+ setScheme(scheme);
},
);
- }
- componentWillUnmount() {
- this._subscription?.remove();
- }
+ return () => subscription?.remove();
+ }, [setScheme]);
- render(): React.Node {
- return (
-
- {theme => {
- return (
-
- {this.state.colorScheme}
-
- );
- }}
-
- );
- }
+ return (
+
+ {theme => {
+ return (
+
+ {colorScheme}
+
+ );
+ }}
+
+ );
}
const ThemedContainer = (props: {children: React.Node}) => (
@@ -69,7 +58,7 @@ const ThemedContainer = (props: {children: React.Node}) => (
);
-const ThemedText = (props: {children: React.Node}) => (
+const ThemedText = (props: {children: React.Node | string}) => (
{theme => {
return {props.children};