Я работаю над проектом Android с использованием Kotlin и Jetpack Compose. По сути, у меня есть список, в который пользователь может добавлять или удалять элементы (подробности ниже). Я хотел бы что-то сделать, когда элемент добавляется в список, например, прокрутить список вниз, если элемент находится вне поля зрения. (Но этот же принцип должен применяться во многих других контекстах/ситуациях, а не только в списках.)
Я мог бы попробовать использовать побочный эффект в пользовательском интерфейсе (составления). Но это должно запускаться при каждом изменении списка, и в этом случае действие будет выполняться после удаления элемента (или после переупорядочения элементов, если это возможно), поскольку не существует прямого способа сравнить новый list в старый список (любая попытка сделать это воспринимается как обходной путь, а не как правильное решение).
Модель представления и репозиторий (подробнее см. ниже) имеют функции, которые добавляют элемент в конец списка. Таким образом, еще одно потенциальное решение — отправить «событие» (через состояние или канал) в пользовательский интерфейс, приказывая ему прокручиваться. Проблема здесь в том, что модель репозитория и представления представляет список как поток, поэтому кажется, что существуют потенциальные условия гонки, когда «событие» для прокрутки списка может поступить в пользовательский интерфейс до того, как новый список перейдет в пользовательский интерфейс. в этом случае он прокручивается до того, как элемент будет добавлен.
По сути, это действие пользовательского интерфейса выглядит так, будто оно должно быть вызвано либо потоком списка, выдающим новое значение, но тогда невозможно узнать какой пользователь действие привело к этому - или модель репозитория/представления успешно добавила новый элемент - но затем в пользовательский интерфейс добавляются 2 новых значения.
Это кажется обычным делом, так что наверняка есть решение.
Упрощенный код:
UI:
@Composable
fun MyScreen() {
val viewModel = viewModel()
val viewState by viewModel.viewState.collectAsStateWithLifecycle(ViewState())
// potentially react to changes in viewState here via side effect - but only after adding?
LazyColumn {
items(viewState.items, key = { it.id }) {
MyListItem(it)
}
}
}
Просмотр модели:
class MyViewModel(private val repository: MyRepository) {
val viewState = repository.items.map { ViewState(items = it) }
fun addItem() {
viewModelScope.launch {
repository.addItem()
// potentially wait for the above to finish, then notify the UI here - but race conditions?
}
}
}
Репозиторий:
(В настоящее время мой репозиторий (одиночный) имеет только частный изменяемый поток состояния, содержащий список. Но я планирую, чтобы репозиторий сохранял список в базе данных комнаты. в будущем.)
class MyRepositoryImpl: MyRepository {
private val _items = MutableStateFlow(emptyList())
override suspend fun addItem() {
val newItem = Item()
_items.update { it.toMutableList().apply { add(newItem) } }
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... m-is-added
Android/Compose: иметь список прокрутки пользовательского интерфейса (только) после добавления нового элемента. ⇐ Android
Форум для тех, кто программирует под Android
1737847825
Anonymous
Я работаю над проектом Android с использованием Kotlin и Jetpack Compose. По сути, у меня есть список, в который пользователь может добавлять или удалять элементы (подробности ниже). Я хотел бы что-то сделать, когда элемент добавляется в список, например, прокрутить список вниз, если элемент находится вне поля зрения. (Но этот же принцип должен применяться во многих других контекстах/ситуациях, а не только в списках.)
Я мог бы попробовать использовать побочный эффект в пользовательском интерфейсе (составления). Но это должно запускаться при каждом изменении списка, и в этом случае действие будет выполняться после удаления элемента (или после переупорядочения элементов, если это возможно), поскольку не существует прямого способа сравнить новый list в старый список (любая попытка сделать это воспринимается как обходной путь, а не как правильное решение).
Модель представления и репозиторий (подробнее см. ниже) имеют функции, которые добавляют элемент в конец списка. Таким образом, еще одно потенциальное решение — отправить «событие» (через состояние или канал) в пользовательский интерфейс, приказывая ему прокручиваться. Проблема здесь в том, что модель репозитория и представления представляет список как поток, поэтому кажется, что существуют потенциальные условия гонки, когда «событие» для прокрутки списка может поступить в пользовательский интерфейс до того, как новый список перейдет в пользовательский интерфейс. в этом случае он прокручивается до того, как элемент будет добавлен.
По сути, это действие пользовательского интерфейса выглядит так, будто оно должно быть вызвано либо потоком списка, выдающим новое значение, но тогда невозможно узнать какой пользователь действие привело к этому - или модель репозитория/представления успешно добавила новый элемент - но затем в пользовательский интерфейс добавляются 2 новых значения.
Это кажется обычным делом, так что наверняка есть решение.
Упрощенный код:
UI:
@Composable
fun MyScreen() {
val viewModel = viewModel()
val viewState by viewModel.viewState.collectAsStateWithLifecycle(ViewState())
// potentially react to changes in viewState here via side effect - but only after adding?
LazyColumn {
items(viewState.items, key = { it.id }) {
MyListItem(it)
}
}
}
Просмотр модели:
class MyViewModel(private val repository: MyRepository) {
val viewState = repository.items.map { ViewState(items = it) }
fun addItem() {
viewModelScope.launch {
repository.addItem()
// potentially wait for the above to finish, then notify the UI here - but race conditions?
}
}
}
Репозиторий:
(В настоящее время мой репозиторий (одиночный) имеет только частный изменяемый поток состояния, содержащий список. Но я планирую, чтобы репозиторий сохранял список в базе данных комнаты. в будущем.)
class MyRepositoryImpl: MyRepository {
private val _items = MutableStateFlow(emptyList())
override suspend fun addItem() {
val newItem = Item()
_items.update { it.toMutableList().apply { add(newItem) } }
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79387717/android-compose-have-ui-scroll-list-only-after-new-item-is-added[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия