Navigation Component による画面遷移
Seo-4d696b75 opened this issue · comments
Navigation Componentを利用します
課題内容
- Navigationのセットアップ
- Navigationで画面遷移を実装する
- SafeArgsでメイン画面から詳細画面にデータを渡す
Navigation Component
これまで画面遷移(Fragmentのトランザクション)はFragmentManagerを直接利用していました。Naviigationを利用するとより効率的に安全にFragmenの画面遷移を実装できます。
- NavGraphの定義により宣言的に画面遷移を扱える
- 遷移先にデータを安全に渡せる
SafeArgs
Navigationにおいてデスティネーション(遷移先のFragment)には引数を設定することができます。この引数を型安全に扱うためのGradleプラグインがSafeArgsです。プラグインのセットアップ方法は公式ドキュメントを参照してください。
例えば、次のようなデスティネーションにString型の引数を定義すると、
<fragment
android:id="@+id/myFragment"
android:name="jp.co.yumemi.droidtraining.ui.MyFragment"
android:label="Forecast">
<argument
android:name="key"
app:argType="string" />
</fragment>
MyFragment
をデスティネーションとするactionにはString型の引数が必要になります
val action = SomeFragmentDirections.someAction("value")
受け取るFragment側ではnavArgs
で引数を取得できます。
// MyFragmentArgsはプラグインが自動生成した引数の型です
val args: MyFragmentArgs by navArgs()
val key: String = args.key
val viewModel: MyViewModel by viewModels()
ViewModelで引数を受け取ることもできます。
@HiltViewModel
class MyViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
) : ViewModel() {
private val args by lazy {
MyFragmentArgs.fromSavedStateHandle(savedStateHandle)
}
}