テーマ
テーマを使用すると、React Navigationによって提供される様々なコンポーネントの色を変更できます。テーマを使用して以下のことができます。
- ブランドに合わせて色をカスタマイズする
- 時刻またはユーザー設定に基づいて、ライトテーマとダークテーマを提供する
基本的な使い方
カスタムテーマを渡すには、ナビゲーションコンテナに`theme` propを渡します。
import * as React from 'react';
import { NavigationContainer, DefaultTheme } from '@react-navigation/native';
const MyTheme = {
...DefaultTheme,
colors: {
...DefaultTheme.colors,
primary: 'rgb(255, 45, 85)',
},
};
export default function App() {
return (
<NavigationContainer theme={MyTheme}>{/* content */}</NavigationContainer>
);
}
`theme` propを動的に変更することができ、すべてのコンポーネントは新しいテーマを反映して自動的に更新されます。`theme` propを提供していない場合は、デフォルトのテーマが使用されます。
テーマは、使用する色のリストを含むJSオブジェクトです。以下のプロパティが含まれています。
- `dark` (`boolean`): ダークテーマかライトテーマか
- `colors` (`object`): react navigationコンポーネントで使用される様々な色
- `primary` (`string`): アプリのプライマリカラーで、様々な要素の色付けに使用されます。通常はブランドカラーを使用します。
- `background` (`string`): 画面の背景色など、様々な背景の色。
- `card` (`string`): ヘッダー、タブバーなどのカードのような要素の背景色。
- `text` (`string`): 様々な要素のテキストの色。
- `border` (`string`): 境界線の色。例:ヘッダーの境界線、タブバーの境界線など。
- `notification` (`string`): タブナビゲーターバッジの色。
カスタムテーマを作成する際には、これらのプロパティをすべて指定する必要があります。
テーマの例
const MyTheme = {
dark: false,
colors: {
primary: 'rgb(255, 45, 85)',
background: 'rgb(242, 242, 242)',
card: 'rgb(255, 255, 255)',
text: 'rgb(28, 28, 30)',
border: 'rgb(199, 199, 204)',
notification: 'rgb(255, 69, 58)',
},
};
テーマを提供することで、すべての公式ナビゲーターのスタイリングが処理されます。React Navigationは、ナビゲーターのカスタマイズを支援するためのツールもいくつか提供しており、ナビゲーター内の画面もテーマを使用できます。
組み込みテーマ
オペレーティングシステムがライトモードとダークモードの組み込みサポートを追加するにつれて、ダークモードのサポートは、トレンドに追従するというよりも、アプリの動作に対する平均的なユーザーの期待に応えることになっています。OSのデフォルトと合理的に一致する形でライトモードとダークモードのサポートを提供するために、これらのテーマはReact Navigationに組み込まれています。
デフォルトテーマとダークテーマは、次のようにインポートできます。
import { DefaultTheme, DarkTheme } from '@react-navigation/native';
オペレーティングシステムの設定を使用する
iOS 13+とAndroid 10+では、(`useColorScheme`フック)を使用して、ユーザーが好むカラースキーム(`'dark'`または`'light'`)を取得できます。
import { useColorScheme } from 'react-native';
import {
NavigationContainer,
DefaultTheme,
DarkTheme,
} from '@react-navigation/native';
export default () => {
const scheme = useColorScheme();
return (
<NavigationContainer theme={scheme === 'dark' ? DarkTheme : DefaultTheme}>
{/* content */}
</NavigationContainer>
);
};
独自のコンポーネントで現在のテーマを使用する
ナビゲーションコンテナ内でレンダリングされる任意のコンポーネントでテーマにアクセスするには、`useTheme`フックを使用します。テーマオブジェクトが返されます。
import * as React from 'react';
import { TouchableOpacity, Text } from 'react-native';
import { useTheme } from '@react-navigation/native';
// Black background and white text in light theme, inverted on dark theme
function MyButton() {
const { colors } = useTheme();
return (
<TouchableOpacity style={{ backgroundColor: colors.card }}>
<Text style={{ color: colors.text }}>Button!</Text>
</TouchableOpacity>
);
}