Skip to content

Commit c5161ab

Browse files
authored
fix: avoid gratuitous re-rendering of components using settings or theme (#4619)
1 parent 8fb590a commit c5161ab

File tree

1 file changed

+13
-10
lines changed

1 file changed

+13
-10
lines changed

src/core/PaperProvider.tsx

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ const PaperProvider = (props: Props) => {
7676
};
7777
}, [props.theme, isOnlyVersionInTheme]);
7878

79-
const getTheme = () => {
79+
const theme = React.useMemo(() => {
8080
const themeVersion = props.theme?.version || 3;
8181
const scheme = colorScheme || 'light';
8282
const defaultThemeBase = defaultThemesByVersion[themeVersion][scheme];
@@ -95,21 +95,24 @@ const PaperProvider = (props: Props) => {
9595
...extendedThemeBase,
9696
isV3: extendedThemeBase.version === 3,
9797
};
98-
};
98+
}, [colorScheme, props.theme, reduceMotionEnabled]);
9999

100100
const { children, settings } = props;
101101

102+
const settingsValue = React.useMemo(
103+
() => ({
104+
icon: MaterialCommunityIcon,
105+
rippleEffectEnabled: true,
106+
...settings,
107+
}),
108+
[settings]
109+
);
110+
102111
return (
103112
<SafeAreaProviderCompat>
104113
<PortalHost>
105-
<SettingsProvider
106-
value={{
107-
icon: MaterialCommunityIcon,
108-
rippleEffectEnabled: true,
109-
...settings,
110-
}}
111-
>
112-
<ThemeProvider theme={getTheme()}>{children}</ThemeProvider>
114+
<SettingsProvider value={settingsValue}>
115+
<ThemeProvider theme={theme}>{children}</ThemeProvider>
113116
</SettingsProvider>
114117
</PortalHost>
115118
</SafeAreaProviderCompat>

0 commit comments

Comments
 (0)