Skip to content

Commit c47a035

Browse files
yungstersfacebook-github-bot
authored andcommitted
RN: Change Dimensions to Return EventSubscription
Summary: Changes `Dimensions.addEventListener` to return an `EventSubscription` object that has a `remove()` method on it. In an upcoming commit, calling `Dimensions.removeEventListener` will lead to a deprecation warning. Changelog: [General][Change] - `Dimensions.addEventListener` now returns an `EventSubscription`. Reviewed By: kacieb Differential Revision: D26808827 fbshipit-source-id: 0cfdc65b83c177f60937c1aa3a4cf633592f73d7
1 parent 42fa4a6 commit c47a035

File tree

3 files changed

+24
-14
lines changed

3 files changed

+24
-14
lines changed

Libraries/Utilities/Dimensions.js

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

11-
import EventEmitter from '../vendor/emitter/EventEmitter';
11+
import EventEmitter, {
12+
type EventSubscription,
13+
} from '../vendor/emitter/EventEmitter';
1214
import RCTDeviceEventEmitter from '../EventEmitter/RCTDeviceEventEmitter';
1315
import NativeDeviceInfo, {
1416
type DisplayMetrics,
@@ -100,24 +102,28 @@ class Dimensions {
100102
* are the same as the return values of `Dimensions.get('window')` and
101103
* `Dimensions.get('screen')`, respectively.
102104
*/
103-
static addEventListener(type: 'change', handler: Function) {
105+
static addEventListener(
106+
type: 'change',
107+
handler: Function,
108+
): EventSubscription {
104109
invariant(
105110
type === 'change',
106111
'Trying to subscribe to unknown event: "%s"',
107112
type,
108113
);
109-
eventEmitter.addListener(type, handler);
114+
return eventEmitter.addListener(type, handler);
110115
}
111116

112117
/**
113-
* Remove an event handler.
118+
* @deprecated Use `remove` on the EventSubscription from `addEventListener`.
114119
*/
115120
static removeEventListener(type: 'change', handler: Function) {
116121
invariant(
117122
type === 'change',
118123
'Trying to remove listener for unknown event: "%s"',
119124
type,
120125
);
126+
// NOTE: This will report a deprecation notice via `console.error`.
121127
eventEmitter.removeListener(type, handler);
122128
}
123129
}

Libraries/Utilities/useWindowDimensions.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ export default function useWindowDimensions(): DisplayMetrics {
2525
setDimensions(window);
2626
}
2727
}
28-
Dimensions.addEventListener('change', handleChange);
28+
const subscription = Dimensions.addEventListener('change', handleChange);
2929
// We might have missed an update between calling `get` in render and
3030
// `addEventListener` in this handler, so we set it here. If there was
3131
// no change, React will filter out this update as a no-op.
3232
handleChange({window: Dimensions.get('window')});
3333
return () => {
34-
Dimensions.removeEventListener('change', handleChange);
34+
subscription.remove();
3535
};
3636
}, [dimensions]);
3737
return dimensions;

packages/rn-tester/js/examples/Dimensions/DimensionsExample.js

+12-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* @flow
99
*/
1010

11+
import type {EventSubscription} from 'react-native/Libraries/vendor/emitter/EventEmitter';
1112
import {Dimensions, Text, useWindowDimensions} from 'react-native';
1213
import * as React from 'react';
1314

@@ -19,20 +20,23 @@ class DimensionsSubscription extends React.Component<
1920
dims: Dimensions.get(this.props.dim),
2021
};
2122

23+
_dimensionsSubscription: ?EventSubscription;
24+
2225
componentDidMount() {
23-
Dimensions.addEventListener('change', this._handleDimensionsChange);
26+
this._dimensionsSubscription = Dimensions.addEventListener(
27+
'change',
28+
dimensions => {
29+
this.setState({
30+
dims: dimensions[this.props.dim],
31+
});
32+
},
33+
);
2434
}
2535

2636
componentWillUnmount() {
27-
Dimensions.removeEventListener('change', this._handleDimensionsChange);
37+
this._dimensionsSubscription?.remove();
2838
}
2939

30-
_handleDimensionsChange = dimensions => {
31-
this.setState({
32-
dims: dimensions[this.props.dim],
33-
});
34-
};
35-
3640
render() {
3741
return <Text>{JSON.stringify(this.state.dims, null, 2)}</Text>;
3842
}

0 commit comments

Comments
 (0)