Почему Compose не запускает рекомпозицию при обновлении состояния?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Почему Compose не запускает рекомпозицию при обновлении состояния?

Сообщение Anonymous »

Я разрабатываю приложение для Android с использованием Jetpack Compose и архитектуры MVVM. Когда я нажимаю кнопку «Добавить», в список добавляется новая заметка, но пользовательский интерфейс не перестраивается для отображения новой заметки.
Вот мой полный код:

Код: Выделить всё

data class Note(
val text: String = ""
)

data class UiState(
val notes: List
)

class NoteRepository {
private val notes = mutableListOf()

fun getNotes(): List = notes

fun addNote(note: Note) {
notes.add(note)
}
}

class NoteViewModel : ViewModel() {
private val repository = NoteRepository()

private val _uiState = MutableStateFlow(UiState(repository.getNotes()))

val uiState: StateFlow = _uiState.asStateFlow()

fun addNote(note: Note) {
repository.addNote(note)

// Logging to check the state update
Log.d("NoteViewModel", "Notes list: ${repository.getNotes()}")

//_uiState.value = uiState.value.copy(notes = repository.getNotes())
_uiState.value = UiState(repository.getNotes())
}
}

@Composable
fun Board(modifier: Modifier = Modifier, viewModel: NoteViewModel) {
val uiState by viewModel.uiState.collectAsState()

Box(modifier = Modifier
.fillMaxSize()
.then(modifier)
) {
Button(
onClick = { viewModel.addNote(Note()) },
modifier = Modifier.align(Alignment.BottomEnd)
) {
Text(text = "Add")
}

Column {
uiState.notes.forEach { _ ->
Box(
modifier = Modifier
.padding(6.dp)
.size(20.dp)
.background(Color.Blue)
)
}
}
}
}

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
NoteTheme {
Board(viewModel = viewModel())
}
}
}
}
Могу подтвердить, что заметка добавляется в список при нажатии на кнопку. Однако пользовательский интерфейс не обновляется для отображения вновь добавленной заметки.
Изменить
Использование mutableStateListOf вместо mutableListOf в классе репозитория решает проблему:

Код: Выделить всё

private val notes = mutableStateListOf()
Однако такой подход делает репозиторий зависимым от Compose, чего я бы предпочел избежать.

Подробнее здесь: https://stackoverflow.com/questions/787 ... ate-update
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»