We have a deprecated ThemeProvider which takes in a ThemeRegistry
. The new ThemeProvider takes in the ThemeReference
. This page provides guidance on how to move from the deprecated to the newer system.
The new ThemeProvider
takes in a different object as its value, a ThemeReference
, so you'll need to convert your ThemeRegistry
into a ThemeReference
in order to use the new ThemeProvider
.
If you were using createPlatformThemeRegistry(<paletteName>)
to create your ThemeRegistry
, you can get an equivalent ThemeReference
by calling createOfficeTheme({ paletteName: <paletteName> })
instead. Details on createOfficeTheme
can be found here.
The gist is that what used to be the ProcessTheme
function passed into the ThemeRegistry
's setTheme
can now be turned into a ThemeRecipe
passed into the ThemeReference
. So where a ThemeRegistry
might have had:
import { createThemeRegistry, Theme, PartialTheme, resolvePartialTheme } from '@uifabricshared/theming-react-native';
const registry = createThemeRegistry(baseTheme, resolvePartialTheme);
registry.setTheme((parentTheme: Theme) => {
return { colors: { background: theme.colors.themeDarker } };
});
the ThemeReference
would have:
import { ThemeReference } from '@fluentui-react-native/theme';
import { Theme, PartialTheme } from '@fluentui-react-native/framework';
const themeRef = new ThemeReference(
baseTheme,
(parentTheme: Theme): PartialTheme => {
return { colors: { background: theme.colors.themeDarker } };
}, // no resolver needed, automatically deeply merged into baseTheme
);
ThemeReferences
can also take advantage of our default themes. Learn how to create custom themes here.
The new ThemeProvider
resides in a different package and takes in the ThemeReference
instead. You'll want to change which package you import the ThemeProvider
from, and then take the theme you converted and pass it into the new ThemeProvider
:
import { ThemeProvider } from @uifabricshared/theming-react-native;
const App = () => {
const themeRegistry = getThemeRegistry();
return (
<ThemeProvider registry={themeRegistry}>
<AppContent />
</ThemeProvider>
)
}
to
import { ThemeProvider } from @fluentui-react-native/theme;
const App = () => {
const themeRef = getThemeReference();
return (
<ThemeProvider theme={themeRef}>
<AppContent />
</ThemeProvider>
)
}
The new ThemeProvider uses the same context as the old one, so accessing the theme still uses the same useFluentTheme()
hook - no functional change is needed to access the theme with the new ThemeProvider
. The only change you'll want to make is to import useFluentTheme()
from the newer package:
import { useFluentTheme } from @uifabricshared/theming-react-native;
to
import { useFluentTheme } from @fluentui-react-native/framework;