駅選択画面では共有ViewModelを使いますので、NavGraphの作成で必要な依存ライブラリを:feature:depart:stationモジュールのbuild.gradle.ktsに追記します。
:
dependencies {
:
implementation(project(":core:navigation"))
implementation(project(":feature:depart:navigation"))
:
}
追記後、『Sync Now』で内容をプロジェクトに反映させます。
:feature:depart:stationモジュールにnavigationディレクトリ(パッケージ)を追加し、直下にDepartStationNavGraph.ktを作成します。
package jp.co.progress_llc.portal.feature.depart.station.navigation
import androidx.compose.runtime.remember
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import jp.co.progress_llc.portal.core.navigation.LocalNavController
import jp.co.progress_llc.portal.feature.depart.ui.viewmodel.DepartRouteEditViewModel
import jp.co.progress_llc.portal.feature.depart.station.presentation.DepartStationScreen
import jp.co.progress_llc.portal.feature.depart.navigation.DEPART_ROUTE_EDIT
const val DEPART_STATION = "depart_station"
fun NavGraphBuilder.departStationNavGraph() {
composable(DEPART_STATION) { backStackEntry ->
val navController = LocalNavController.current
val parentEntry = remember(backStackEntry) {
navController.getBackStackEntry(DEPART_ROUTE_EDIT)
}
val viewModel: DepartRouteEditViewModel = hiltViewModel(parentEntry)
DepartStationScreen(departRouteEditViewModel = viewModel)
}
}
:feature:depart:stationモジュールにdiディレクトリ(パッケージ)を追加し、直下にDepartStationNavGraphModule.ktを作成し、NavGraphをDI(Hilt)に登録します。
package jp.co.progress_llc.portal.feature.depart.station.di
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet
import androidx.navigation.NavGraphBuilder
import jp.co.progress_llc.portal.feature.depart.station.navigation.departStationNavGraph
@Module
@InstallIn(SingletonComponent::class)
object DepartStationNavGraphModule {
@Provides
@IntoSet
fun provideDepartStationNavGraph(): NavGraphBuilder.() -> Unit = {
departStationNavGraph()
}
}
駅選択画面は、発車予定モジュールの経路一覧編集画面から遷移しますので、:feature:depart:routeモジュールに駅選択画面への依存を追記します。
:
dependencies {
:
implementation(project(":core:navigation"))
implementation(project(":feature:depart:ui"))
implementation(project(":feature:depart:navigation"))
implementation(project(":feature:depart:station"))
:
}
追記後、『Sync Now』で内容をプロジェクトに反映させます。
:feature:depart:routeにdebugソースセットを追加し、viewmodelディレクトリ(パッケージ)を作成します。
viewmodelディレクトリ(パッケージ)の直下にプレビュー用のDI(Hilt)を使用しないViewModel実装をDepartRouteEditViewModelPreviewで作成します。
package jp.co.progress_llc.portal.feature.depart.route.viewmodel
import jp.co.progress_llc.portal.feature.depart.ui.viewmodel.DepartRouteEditViewModelContract
class DepartRouteEditViewModelPreview : DepartRouteEditViewModelContract {
override var stationType = "発駅"
override var stationCode = ""
override var stationName = ""
}
発車予定モジュールの経路一覧編集画面に駅選択画面への遷移を追記します。
:
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
:
import jp.co.progress_llc.portal.core.navigation.LocalNavController
import jp.co.progress_llc.portal.feature.depart.ui.viewmodel.DepartRouteEditViewModel
import jp.co.progress_llc.portal.feature.depart.ui.viewmodel.DepartRouteEditViewModelContract
import jp.co.progress_llc.portal.feature.depart.station.navigation.DEPART_STATION
:
fun DepartRouteScreen() {
fun DepartRouteScreen(
navController: NavController = LocalNavController.current
departRouteEditViewModel:
DepartRouteEditViewModelContract = hiltViewModel<DepartRouteEditViewModel>()
) {
:
CustomOutlinedTextField(
value = departureStation,
:
readOnly = true,
onClick = {
departRouteEditViewModel.stationType = FieldName.DEPARTURE
navController.navigate(DEPART_STATION)
},
:
CustomOutlinedTextField(
value = viaStation,
:
readOnly = true,
onClick = {
departRouteEditViewModel.stationType = FieldName.VIA
navController.navigate(DEPART_STATION)
},
:
CustomOutlinedTextField(
value = arrivalStation,
:
readOnly = true,
onClick = {
departRouteEditViewModel.stationType = FieldName.ARRIVAL
navController.navigate(DEPART_STATION)
},
:
fun DepartRouteScreenPreview() {
AppTheme {
DepartRouteScreen()
val previewNavController: NavController = rememberNavController()
DepartRouteScreen(
navController = previewNavController,
departRouteEditViewModel = DepartRouteEditViewModelPreview()
)
経路一覧編集画面のNavGraphを共有ViewModelを使用するように変更し、遷移先の駅選択画面のNavGraphを追記します。
:
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import jp.co.progress_llc.portal.core.navigation.LocalNavController
import jp.co.progress_llc.portal.core.navigation.findBackStackEntry
import jp.co.progress_llc.portal.feature.depart.ui.viewmodel.DepartRouteEditViewModel
import jp.co.progress_llc.portal.feature.depart.navigation.DEPART_ROUTE_EDIT
import jp.co.progress_llc.portal.feature.depart.station.navigation.departStationNavGraph
:
fun NavGraphBuilder.departRouteNavGraph() {
composable(DEPART_ROUTE) {
DepartRouteScreen()
composable(DEPART_ROUTE) { backStackEntry ->
val navController = LocalNavController.current
val parentEntry = remember(backStackEntry) {
navController.getBackStackEntry(DEPART_ROUTE_EDIT)
}
val viewModel: DepartRouteEditViewModel = hiltViewModel(parentEntry)
DepartRouteScreen(departRouteEditViewModel = viewModel)
}
}
共有NavGraphにViewModelを共有する駅選択画面のNavGraphを追記します。
:
import jp.co.progress_llc.portal.feature.depart.station.navigation.departStationNavGraph
:
fun NavGraphBuilder.departRouteEditNavGraph() {
:
departRouteNavGraph()
departStationNavGraph()
:
エミュレーターでアプリケーションを実行して、画面遷移で発車予定の駅選択画面が表示されることを確認します。