Skip to content

Commit 0f692f2

Browse files
committed
[fix] Dimensions.get() should not call change listeners
Fixes a bug introduced by 59af091 Fix #2394
1 parent dee258a commit 0f692f2

File tree

2 files changed

+38
-32
lines changed

2 files changed

+38
-32
lines changed

packages/react-native-web/src/exports/Dimensions/__tests__/index-test.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import Dimensions from '..';
99

1010
describe('apis/Dimensions', () => {
1111
test('get', () => {
12+
const handler = jest.fn();
13+
Dimensions.addEventListener('change', handler);
1214
expect(Dimensions.get('screen')).toMatchInlineSnapshot(`
1315
{
1416
"fontScale": 1,
@@ -25,6 +27,7 @@ describe('apis/Dimensions', () => {
2527
"width": 1024,
2628
}
2729
`);
30+
expect(handler).toHaveBeenCalledTimes(0);
2831
});
2932

3033
test('set', () => {
@@ -34,21 +37,21 @@ describe('apis/Dimensions', () => {
3437
test('addEventListener', () => {
3538
const handler = jest.fn();
3639
const subscription = Dimensions.addEventListener('change', handler);
37-
Dimensions._update();
40+
window.dispatchEvent(new Event('resize'));
3841
expect(handler).toHaveBeenCalledTimes(1);
3942
expect(handler).toHaveBeenLastCalledWith({
4043
window: Dimensions.get('window'),
4144
screen: Dimensions.get('screen')
4245
});
4346
subscription.remove();
44-
Dimensions._update();
47+
window.dispatchEvent(new Event('resize'));
4548
expect(handler).toHaveBeenCalledTimes(1);
4649
});
4750

4851
test('removeEventListener', () => {
4952
const handler = jest.fn();
5053
Dimensions.removeEventListener('change', handler);
51-
Dimensions._update();
54+
window.dispatchEvent(new Event('resize'));
5255
expect(handler).toHaveBeenCalledTimes(0);
5356
});
5457
});

packages/react-native-web/src/exports/Dimensions/index.js

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,41 @@ const listeners = {};
4646

4747
let shouldInit = canUseDOM;
4848

49+
function update() {
50+
if (!canUseDOM) {
51+
return;
52+
}
53+
54+
const win = window;
55+
const docEl = win.document.documentElement;
56+
57+
dimensions.window = {
58+
fontScale: 1,
59+
height: docEl.clientHeight,
60+
scale: win.devicePixelRatio || 1,
61+
width: docEl.clientWidth
62+
};
63+
64+
dimensions.screen = {
65+
fontScale: 1,
66+
height: win.screen.height,
67+
scale: win.devicePixelRatio || 1,
68+
width: win.screen.width
69+
};
70+
}
71+
72+
function handleResize() {
73+
update();
74+
if (Array.isArray(listeners['change'])) {
75+
listeners['change'].forEach((handler) => handler(dimensions));
76+
}
77+
}
78+
4979
export default class Dimensions {
5080
static get(dimension: DimensionKey): DisplayMetrics {
5181
if (shouldInit) {
5282
shouldInit = false;
53-
Dimensions._update();
83+
update();
5484
}
5585
invariant(dimensions[dimension], `No dimension set for key ${dimension}`);
5686
return dimensions[dimension];
@@ -71,33 +101,6 @@ export default class Dimensions {
71101
}
72102
}
73103

74-
static _update() {
75-
if (!canUseDOM) {
76-
return;
77-
}
78-
79-
const win = window;
80-
const docEl = win.document.documentElement;
81-
82-
dimensions.window = {
83-
fontScale: 1,
84-
height: docEl.clientHeight,
85-
scale: win.devicePixelRatio || 1,
86-
width: docEl.clientWidth
87-
};
88-
89-
dimensions.screen = {
90-
fontScale: 1,
91-
height: win.screen.height,
92-
scale: win.devicePixelRatio || 1,
93-
width: win.screen.width
94-
};
95-
96-
if (Array.isArray(listeners['change'])) {
97-
listeners['change'].forEach((handler) => handler(dimensions));
98-
}
99-
}
100-
101104
static addEventListener(
102105
type: DimensionEventListenerType,
103106
handler: (DimensionsValue) => void
@@ -125,5 +128,5 @@ export default class Dimensions {
125128
}
126129

127130
if (canUseDOM) {
128-
window.addEventListener('resize', Dimensions._update, false);
131+
window.addEventListener('resize', handleResize, false);
129132
}

0 commit comments

Comments
 (0)