Уведомление об изменении данных из UI на jetpack compose

Честно говоря за всё это время пока начал изучать, начинаю теряться в многообразных паттернах. Суть проблемы достаточно проста: я не могу редактировать модель из UI. У меня есть экран отображающий несколько моделей и позволяющий прямо на нём их редактировать (встречал до этого только примеры с редактированием в отдельном экране). В теории я могу создавать по ViewModel на каждую карточку редактирования, но что то мне подсказывает это неправильно и (вроде как) ViewModel на экране должен быть один.

Код выглядит следующим образом (упрощена верстка):
DisciplineEditScreen.kt

@Composable
fun DisciplineEditScreen(padding: PaddingValues) {
    val viewModel by remember { mutableStateOf(DisciplineEditViewModel()) }
    val uiState = viewModel.uiState.collectAsState()

    DisciplineEditScreenContent(
        uiState
    )
}

@Composable
fun DisciplineEditScreenContent( uiState : State<DisciplineEditUiState>) {
    if (uiState.value.loading) {
        Column {
            CircleLoading()
        }
    } else {
        LazyColumn {
            items(uiState.value.disciplines ?: listOf()) { discipline ->
                DisciplineCard(
                    discipline = discipline,
                    onNameChange = {
                        discipline.name = it
                    }
                )
            }
        }
    }
}

@OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class)
@Composable
fun DisciplineCard(
    discipline: Discipline,
    onNameChange : (String) -> Unit,
) {
    OutlinedCard {
        Column {
            Text("Редактирование записи #${discipline.id}")
            OutlinedTextField(
                value = discipline.name,
                onValueChange = onNameChange,
                label = { Text("Наименование дисциплины") },
                singleLine = true
            )
        }
    }
}

DisciplineEditViewModel.kt

data class DisciplineEditUiState(
    val loading : Boolean = true,
    val disciplines: List<Discipline>? = null
)

class DisciplineEditViewModel : ViewModel() {
    private val _uiState = MutableStateFlow(DisciplineEditUiState())
    val uiState: StateFlow<DisciplineEditUiState> = _uiState.asStateFlow()
    private val repo = DisciplineEditRepository()

    init {
        viewModelScope.launch {
            _uiState.update {
                it.copy(
                    loading = false,
                    disciplines = repo.load()
                )
            }
        }
    }
}

При взаимодействиями с полями ничего не происходит (курсор просто бегает). Не уверен что в Stateless реализацию вообще нужно прокидывать кастомные классы. Видел реализации где прокидывают разбитые примитивы из модели.


Ответы (1 шт):

Автор решения: Vladimir

решение

ViewModel.kt


...
val items = mutableStateListOf<Discipline>()
...

всё это время я использовал (в т.ч. пытался) mutableListOf не уведомляющий compose о своём изменении

→ Ссылка