駅を選択する画面を:feature:depart:stationモジュールに作成します。
共通UIモジュールの作成と同様に、トップディレクトリで:feature:depart:stationを作成し、javaディレクトリ名の変更、および、サンプルテストクラスの削除を行います。
:feature:depart:stationモジュールのbuild.gradle.ktsに作成したビルドプラグインを適用します。
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
id("build.logic.feature.configure")
}
android {
namespace = "jp.co.progress_llc.portal.feature.depart.station"
compileSdk {
version = release(36)
}
defaultConfig {
minSdk = 28
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
implementation(project(":core:ui"))
implementation(project(":feature:depart:ui"))
}
適用後、『Sync Now』で内容をプロジェクトに反映させます。
:feature:depart:stationにdebugソースセットを追加し、viewmodelディレクトリ(パッケージ)を作成します。
viewmodelディレクトリ(パッケージ)の直下にプレビュー用のDI(Hilt)を使用しないViewModel実装をDepartRouteEditViewModelPreviewで作成します。
package jp.co.progress_llc.portal.feature.depart.station.viewmodel
import jp.co.progress_llc.portal.feature.depart.ui.viewmodel.DepartRouteEditViewModelContract
class DepartRouteEditViewModelPreview : DepartRouteEditViewModelContract {
override var stationType = "発駅"
override var stationCode = ""
override var stationName = ""
}
:feature:depart:stationにpresentationディレクトリ(パッケージ)を追加し、直下に暫定的に共有ViewModelのみのDepartStationScreen.ktを作成します。
package jp.co.progress_llc.portal.feature.depart.station.presentation
import androidx.compose.runtime.*
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import jp.co.progress_llc.portal.core.ui.theme.AppTheme
import jp.co.progress_llc.portal.core.ui.components.AppTitleBox
import jp.co.progress_llc.portal.core.ui.components.CustomOutlinedTextField
import jp.co.progress_llc.portal.feature.depart.ui.viewmodel.DepartRouteEditViewModelContract
import jp.co.progress_llc.portal.feature.depart.ui.viewmodel.DepartRouteEditViewModel
import jp.co.progress_llc.portal.feature.depart.station.viewmodel.DepartRouteEditViewModelPreview
@Composable
fun DepartStationScreen(
departRouteEditViewModel:
DepartRouteEditViewModelContract = hiltViewModel<DepartRouteEditViewModel>()
) {
val stationType = departRouteEditViewModel.stationType
var searchText by remember { mutableStateOf("") }
Scaffold(
topBar = { AppTitleBox() }
) { innerPadding ->
Box(
modifier = Modifier
.padding(innerPadding)
.fillMaxSize()
) {
Column(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background)
.padding(8.dp),
verticalArrangement = Arrangement.spacedBy(2.dp)
) {
Text(
text = stationType + "選択",
style = MaterialTheme.typography.titleLarge,
)
Row(
modifier = Modifier
.fillMaxWidth()
.padding(top = 10.dp)
.height(32.dp)
.padding(horizontal = 8.dp),
verticalAlignment = Alignment.CenterVertically
) {
CustomOutlinedTextField(
value = searchText,
onValueChange = { value: String -> searchText = value },
label = { Text(stationType, style = MaterialTheme.typography.bodySmall) },
placeholder = "検索する" + stationType + "名を入力してください",
modifier = Modifier.weight(1f),
textStyle = MaterialTheme.typography.bodySmall.copy(
color = MaterialTheme.colorScheme.primary
),
contentPadding = PaddingValues(start = 12.dp, end = 8.dp, top = 2.dp),
shape = RoundedCornerShape(6.dp),
singleLine = true,
height = 32.dp
)
Spacer(modifier = Modifier.width(8.dp))
Button(
onClick = { },
modifier = Modifier.height(32.dp),
contentPadding = PaddingValues(horizontal = 12.dp),
shape = RoundedCornerShape(6.dp)
) {
Text(
text = "検索",
style = MaterialTheme.typography.bodySmall
)
}
}
}
}
}
}
@Preview(showBackground = true)
@Composable
fun DepartStationScreenPreview() {
AppTheme {
DepartStationScreen(
departRouteEditViewModel = DepartRouteEditViewModelPreview()
)
}
}