Skip to content

Commit 305b425

Browse files
yungstersfacebook-github-bot
authored andcommitted
RN: Change Appearance to Return EventSubscription
Summary: Changes `Appearance.addChangeListener` to return an `EventSubscription` object that has a `remove()` method on it. In an upcoming commit, calling `Appearance.removeChangeListener` will lead to a deprecation warning. Changelog: [General][Change] - `Appearance.addChangeListener` now returns an `EventSubscription`. Reviewed By: kacieb Differential Revision: D26696388 fbshipit-source-id: d0bdeffff3a2a366b3c11b6dc1417dfb2f1455c2
1 parent fb0a7ed commit 305b425

File tree

3 files changed

+23
-13
lines changed

3 files changed

+23
-13
lines changed

Libraries/Utilities/Appearance.js

+9-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
* @flow strict-local
99
*/
1010

11-
import EventEmitter from '../vendor/emitter/EventEmitter';
11+
import EventEmitter, {
12+
type EventSubscription,
13+
} from '../vendor/emitter/EventEmitter';
1214
import NativeEventEmitter from '../EventEmitter/NativeEventEmitter';
1315
import NativeAppearance, {
1416
type AppearancePreferences,
@@ -78,16 +80,19 @@ module.exports = {
7880
);
7981
return nativeColorScheme;
8082
},
83+
8184
/**
8285
* Add an event handler that is fired when appearance preferences change.
8386
*/
84-
addChangeListener(listener: AppearanceListener): void {
85-
eventEmitter.addListener('change', listener);
87+
addChangeListener(listener: AppearanceListener): EventSubscription {
88+
return eventEmitter.addListener('change', listener);
8689
},
90+
8791
/**
88-
* Remove an event handler.
92+
* @deprecated Use `remove` on the EventSubscription from `addEventListener`.
8993
*/
9094
removeChangeListener(listener: AppearanceListener): void {
95+
// NOTE: This will report a deprecation notice via `console.error`.
9196
eventEmitter.removeListener('change', listener);
9297
},
9398
};

Libraries/Utilities/useColorScheme.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ export default function useColorScheme(): ?ColorSchemeName {
1818
() => ({
1919
getCurrentValue: () => Appearance.getColorScheme(),
2020
subscribe: callback => {
21-
Appearance.addChangeListener(callback);
22-
return () => Appearance.removeChangeListener(callback);
21+
const appearanceSubscription = Appearance.addChangeListener(callback);
22+
return () => {
23+
appearanceSubscription.remove();
24+
};
2325
},
2426
}),
2527
[],

packages/rn-tester/js/examples/Appearance/AppearanceExample.js

+10-7
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,32 @@
1111
import * as React from 'react';
1212
import {Appearance, Text, useColorScheme, View} from 'react-native';
1313
import type {AppearancePreferences} from 'react-native/Libraries/Utilities/NativeAppearance';
14+
import type {EventSubscription} from 'react-native/Libraries/vendor/emitter/EventEmitter';
1415
import {RNTesterThemeContext, themes} from '../../components/RNTesterTheme';
1516

1617
class ColorSchemeSubscription extends React.Component<
1718
{...},
1819
{colorScheme: ?string, ...},
1920
> {
21+
_subscription: ?EventSubscription;
22+
2023
state = {
2124
colorScheme: Appearance.getColorScheme(),
2225
};
2326

2427
componentDidMount() {
25-
Appearance.addChangeListener(this._handleAppearanceChange);
28+
this._subscription = Appearance.addChangeListener(
29+
(preferences: AppearancePreferences) => {
30+
const {colorScheme} = preferences;
31+
this.setState({colorScheme});
32+
},
33+
);
2634
}
2735

2836
componentWillUnmount() {
29-
Appearance.removeChangeListener(this._handleAppearanceChange);
37+
this._subscription?.remove();
3038
}
3139

32-
_handleAppearanceChange = (preferences: AppearancePreferences) => {
33-
const {colorScheme} = preferences;
34-
this.setState({colorScheme});
35-
};
36-
3740
render() {
3841
return (
3942
<RNTesterThemeContext.Consumer>

0 commit comments

Comments
 (0)