- Изначально я показываю на экране модальное окно DatePicker.
- Когда пользователь выбирает дату, я хочу отобразить несколько кнопок.
- И когда пользователь нажимает на любую из этих кнопок, я хочу передать в ViewModel две части данных: выбранную дату и тип нажатой кнопки, для поиска данные в репозитории с этими двумя критериями.
Моя проблема с этим подходом заключается в том, что я не могу найти способ передать два фрагмента данных перед включением ViewModel.
Я показываю соответствующие части своего кода:
NavGraphBuilder
composable {
CalendarScreen(onTopicClick = onTopicClick,onDateSelected={})
CalendarScreen (вызывается из NavGraphBuilder)
@Composable
fun CalendarScreen(
onTopicClick: (String) -> Unit,
onDateSelected: (Long?) -> Unit,
viewModel: CalendarViewModel = hiltViewModel()
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
DatePickerAndButtons(
onTopicClick = viewModel::onTopicClick,
onDateSelected = viewModel::onDateSelected,
uiState = uiState
)
}
DatePickerAndButtons
@ExperimentalLayoutApi
@Composable
fun DatePickerAndButtons(
onTopicClick: (String) -> Unit,
onDateSelected: (Long?) -> Unit,
uiState: CalendarUiState
) {
var showTopics by remember { mutableStateOf(false) }
var showDatePicker by remember { mutableStateOf(true) }
var selectedDate by remember { mutableStateOf(null) }
when (uiState) {
CalendarUiState.Empty -> Text("Empty")
CalendarUiState.Error -> Text("Error")
CalendarUiState.Loading -> {
Text("Loading")
//showDatePicker=true
}
is CalendarUiState.CalendarData -> {
showTopics=false
//showDatePicker=false
if(uiState.topics.isNotEmpty()) {
//Show data
}else{
//¿?
}
}
}
if (selectedDate != null) {
val date = Date(selectedDate!!)
val formattedDate = SimpleDateFormat("MMM dd, yyyy", Locale.getDefault()).format(date)
Text("Selected date: $formattedDate")
} else {
Text("No date selected")
}
if (showDatePicker) {
DatePickerModal(
onDateSelected = {
selectedDate = it
onDateSelected(it)
//viewModel.onDateSelected(selectedDate)
showDatePicker = false
showTopics=true
},
onDismiss = { showDatePicker = false }
)
}
if(showTopics) {
val chipModifier = Modifier
.padding(4.dp)
.clip(RoundedCornerShape(8.dp))
val rowModifier = Modifier
.padding(horizontal = 8.dp, vertical = 12.dp)
.heightIn(max = 500.dp)
.clip(RoundedCornerShape(8.dp))
Box(
modifier = Modifier,
) {
LazyColumn(modifier = rowModifier) {
item {
OutlinedCardExample()
Spacer(modifier = Modifier.height(10.dp))
}
items(populateData()) { item ->
if (item.parent == "Breviario") {
Text(item.parent, fontSize = 26.sp)
item.childs.forEach {
if (it.group == "a") {
FlowRow(modifier = rowModifier) {
it.items.forEach {
HomeButton(it) {
onTopicClick(it.id.toString())
onDateSelected
}
Spacer(modifier = chipModifier)
}
}
}
if (it.group == "b") {
FlowRow(modifier = rowModifier) {
it.items.forEach {
HomeButton(it) { onTopicClick(it.title) }
Spacer(modifier = chipModifier)
}
}
}
if (it.group == "c") {
FlowRow(modifier = rowModifier) {
it.items.forEach {
HomeButton(it) { onTopicClick(it.title) }
Spacer(modifier = chipModifier)
}
}
}
if (it.group == "d") {
FlowRow(modifier = rowModifier) {
it.items.forEach {
HomeButton(it) { onTopicClick(it.title) }
Spacer(modifier = chipModifier)
}
}
}
HorizontalDivider()
}
} else {
Text(item.parent, fontSize = 26.sp)
item.childs.forEach {
FlowRow(modifier = rowModifier) {
it.items.forEach {
HomeButton(it) { onTopicClick(it.title) }
Spacer(modifier = chipModifier)
}
}
HorizontalDivider()
}
}
}
}
}
}
}
ViewModel
@HiltViewModel
class CalendarViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
val userDataRepository: UserDataRepository,
val universalisRepository: UniversalisRepository,
getTopicWithDate: GetUniversalisFromCalendarUseCase,
) : ViewModel() {
private val selectedTopicIdKey = "selectedTopicIdKey"
private val selectedDateKey = "selectedDateKey"
private val calendarRoute: CalendarRoute = savedStateHandle.toRoute()
private val selectedTopicId = savedStateHandle.getStateFlow(
key = selectedTopicIdKey,
initialValue = "1" //calendarRoute.topicId,
)
private val selectedDate = savedStateHandle.getStateFlow(
key = selectedDateKey,
initialValue = 0
)
val uiState: StateFlow = combine(
selectedTopicId,
getTopicWithDate.invoke(
date = selectedDate.value,
title = "TODO:Title",
selectedTopicId = selectedTopicId.value
),
CalendarUiState::CalendarData,
).
stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = CalendarUiState.Loading,
)
fun onTopicClick(topicId: String?) {
savedStateHandle[selectedTopicIdKey] = topicId
}
fun onDateSelected(date: Long?) {
savedStateHandle[selectedDateKey] = date
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... two-values