Я даже не уверен, какой именно у меня вопрос или какое хорошее название для этого, кроме как в целом: как, черт возьми? Я не разработчик, я просто пытаюсь сделать приложение для себя. Я пробовал использовать отладчик с разрывами кода/функций/строк, входами и выходами, но я вообще не понимаю журнал и что происходит.
Итак, контекст такой. это:
Пытаюсь создать автономное приложение с базой данных для отслеживания коллекции чего-либо. Желаемое поведение, которое я хочу, - это когда приложение запускается, оно переходит в «домашнее» представление, в котором перечислены данные в режиме просмотра «сохранено» (хранилище данных пользовательских настроек). Я переключился между двумя различными представлениями макета данных (таблицей или списком) на этой домашней странице. По сути, я попробовал объединить приложения Inventory и Dessert Release из лабораторий кода в качестве отправной точки.
Вот текущее поведение того, что происходит:
Включая короткое видео (запись экрана):
Приложение запускается, экран пуст в течение нескольких секунд, затем я вижу обновление экрана и ненадолго вижу таблицу данных, прежде чем она будет заменена моей вещью «если список пуст, отобразить добавление элементов» (даже если в базе данных есть данные [Комната, Дао]). Таким образом, при запуске список по какой-то причине не заполняется (он заполняется только в том случае, если я повторно перехожу к этому же экрану), независимо от того, по умолчанию у меня есть представление списка или таблицы (но есть и другое странное поведение в отношении
На этом этапе, если я нажму переключатель, чтобы изменить вид, переключатель будет работать так, как и должен: значок будет меняться вперед и назад при нажатии. Однако данные в базе данных ни в коем случае не отображаются ниже, и этот переключатель работает только тогда, когда представление списка пусто (или, по крайней мере, когда оно думает, что список пуст, но это не так).
Только когда я нажимаю на нижнюю панель навигации по значку дома (это не панель навигации, это настраиваемая нижняя панель приложения, которую я написал), представление обновляется и отображается таблица данных (я добавил данные в базу данных ранее), но затем, как только таблица отобразится, переключатель представления больше не работает. За одним исключением... если я изменю значение по умолчанию для isTableView на «false», произойдет то же самое поведение, за исключением представления списка, однако при отображении представления списка я могу нажать кнопку изменения представления, и значок переключения представления изменится. но он возвращается к состоянию «пустой список», и значок переключателя меняется, но мне все равно приходится повторно переходить на главный экран, чтобы снова открыть представление списка. Я предполагаю, что у меня что-то не так с представлением таблицы (это maven Central oleksandrbalan/lazytable, который я получил от gitHub).
Я пробовал поменять код местами и изменить некоторые порядки, но Я не могу понять, как это сломалось, я играл с этим две недели и не могу понять.
Итак, я собираюсь дать то, что я есть. Предполагается, что это весь соответствующий код, но если необходимо просмотреть другой код, я могу отредактировать его и добавить его. Например, я не включил код конструкции для режима просмотра таблицы или списка или чего-то еще, но он включен та же страница ниже.
HomeScreen:
fun HomeScreen(
navigateToHome: () -> Unit,
navigateToStats: () -> Unit,
navigateToAddEntry: () -> Unit,
navigateToEditEntry: (Int) -> Unit,
modifier: Modifier = Modifier,
viewmodel: HomeViewModel = viewModel(factory = AppViewModelProvider.Factory),
) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
val homeUiState by viewmodel.homeUiState.collectAsState()
val items = homeUiState.items
val isTableView = homeUiState.isTableView
Scaffold(
modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
CellarTopAppBar(
title = stringResource(HomeDestination.titleRes),
scrollBehavior = scrollBehavior,
canNavigateBack = false,
)
},
bottomBar = {
CellarBottomAppBar(
modifier = Modifier
.padding(0.dp),
navigateToHome = navigateToHome,
navigateToStats = navigateToStats,
navigateToAddEntry = navigateToAddEntry,
)
},
) { innerPadding ->
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top,
modifier = Modifier
.fillMaxSize()
.padding(top = 64.dp, bottom = 66.dp, start = 0.dp, end = 0.dp)
) {
HomeHeader(
homeUiState = homeUiState,
selectView = viewmodel::selectView,
isTableView = isTableView,
)
HomeBody(
homeUiState = homeUiState,
items = items,
isTableView = isTableView,
onItemClick = navigateToEditEntry,
modifier = modifier
.fillMaxWidth()
.padding(0.dp),
contentPadding = innerPadding,
)
}
}
}
@Composable
private fun HomeHeader(
modifier: Modifier = Modifier,
homeUiState: HomeUiState,
selectView: (Boolean) -> Unit,
isTableView: Boolean,
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
//Switch table/list view//
Text(
text ="View:",
textAlign = TextAlign.Start,
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
modifier = Modifier
.padding(0.dp)
)
IconButton(
onClick = { selectView(!isTableView) },
modifier = Modifier
.padding(2.dp)
.size(28.dp)
.align(Alignment.Bottom)
) {
Icon(
painter = painterResource(homeUiState.toggleIcon),
contentDescription = stringResource(homeUiState.toggleContentDescription),
tint = MaterialTheme.colorScheme.onBackground,
modifier = Modifier
.size(24.dp)
.padding(0.dp)
)
}
}
}
@Composable
private fun HomeBody(
modifier: Modifier = Modifier,
homeUiState: HomeUiState,
items: List,
isTableView: Boolean,
onItemClick: (Int) -> Unit,
contentPadding: PaddingValues = PaddingValues(0.dp),
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top,
modifier = Modifier
.fillMaxWidth()
.padding(0.dp)
) {
if (items.isEmpty()) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
modifier = Modifier
.fillMaxSize()
) {
Text(
text = stringResource(R.string.no_items),
textAlign = TextAlign.Center,
style = MaterialTheme.typography.titleLarge,
modifier = Modifier
.padding(0.dp),
)
}
}
else {
if (isTableView) {
TableViewMode(
itemsList = homeUiState.items,
contentPadding = contentPadding,
modifier = Modifier
.padding(0.dp),
)
}
else {
ListViewMode(
itemsList = homeUiState.items,
onItemClick = { onItemClick(it.id) },
contentPadding = contentPadding,
modifier = Modifier
.padding(0.dp)
.fillMaxWidth()
)
}
}
}
}
@Composable
fun TableViewMode(
itemsList: List,
contentPadding: PaddingValues,
modifier: Modifier = Modifier,
){
CellarLazyTable(
itemsTbl = itemsList,
contentPadding = contentPadding,
modifier = modifier
.fillMaxWidth()
.padding(0.dp)
)
}
@Composable
fun ListViewMode(
itemsList: List,
onItemClick: (Items) -> Unit,
contentPadding: PaddingValues = PaddingValues(0.dp),
modifier: Modifier = Modifier,
){
LazyColumn(
modifier = modifier
.fillMaxWidth()
.padding(0.dp),
){
items(items = itemsList, key = { it.id }) { item ->
CellarListItem(
item = item,
modifier = Modifier
.padding(0.dp)
.clickable {
onItemClick(item)
}
)
}
}
}
HomeViewModel:
class HomeViewModel(
itemsRepository: ItemsRepository,
private val preferencesRepo: PreferencesRepo
): ViewModel() {
companion object {
private const val TIMEOUT_MILLIS = 5_000L
}
val homeUiState: StateFlow =
merge(
itemsRepository.getAllItemsStream().map { HomeUiState(it) },
preferencesRepo.isTableView.map { isTableView -> HomeUiState(isTableView = isTableView) },
).stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(TIMEOUT_MILLIS),
initialValue = HomeUiState()
)
/* Toggle Cellar View */
fun selectView(isTableView: Boolean) {
viewModelScope.launch {
preferencesRepo.saveViewPreference(isTableView)
}
}
}
data class HomeUiState(
val items: List = listOf(),
val isTableView: Boolean = true,
val toggleContentDescription: Int =
if (isTableView) R.string.list_view_toggle else R.string.table_view_toggle,
val toggleIcon: Int =
if (isTableView) R.drawable.list_view else R.drawable.table_view,
)
Подробнее здесь: https://stackoverflow.com/questions/788 ... breaking-a
Android Compose с использованием объединенной модели представления, проблем с пользовательским интерфейсом и состоянием ⇐ Android
Форум для тех, кто программирует под Android
1722123913
Anonymous
Я даже не уверен, какой именно у меня вопрос или какое хорошее название для этого, кроме как в целом: как, черт возьми? Я не разработчик, я просто пытаюсь сделать приложение для себя. Я пробовал использовать отладчик с разрывами кода/функций/строк, входами и выходами, но я вообще не понимаю журнал и что происходит.
[b]Итак, контекст такой. это:[/b]
Пытаюсь создать автономное приложение с базой данных для отслеживания коллекции чего-либо. Желаемое поведение, которое я хочу, - это когда приложение запускается, оно переходит в «домашнее» представление, в котором перечислены данные в режиме просмотра «сохранено» (хранилище данных пользовательских настроек). Я переключился между двумя различными представлениями макета данных (таблицей или списком) на этой домашней странице. По сути, я попробовал объединить приложения Inventory и Dessert Release из лабораторий кода в качестве отправной точки.
[b]Вот текущее поведение того, что происходит:[/b]
Включая короткое видео (запись экрана):
[youtube]2zG9WwfOuSg[/youtube]
Приложение запускается, экран пуст в течение нескольких секунд, затем я вижу обновление экрана и ненадолго вижу таблицу данных, прежде чем она будет заменена моей вещью «если список пуст, отобразить добавление элементов» (даже если в базе данных есть данные [Комната, Дао]). Таким образом, при запуске список по какой-то причине не заполняется (он заполняется только в том случае, если я повторно перехожу к этому же экрану), независимо от того, по умолчанию у меня есть представление списка или таблицы (но есть и другое странное поведение в отношении
На этом этапе, если я нажму переключатель, чтобы изменить вид, переключатель будет работать так, как и должен: значок будет меняться вперед и назад при нажатии. Однако данные в базе данных ни в коем случае не отображаются ниже, и этот переключатель работает только тогда, когда представление списка пусто (или, по крайней мере, когда оно думает, что список пуст, но это не так).
Только когда я нажимаю на нижнюю панель навигации по значку дома (это не панель навигации, это настраиваемая нижняя панель приложения, которую я написал), представление обновляется и отображается таблица данных (я добавил данные в базу данных ранее), но затем, как только таблица отобразится, переключатель представления больше не работает. За одним исключением... если я изменю значение по умолчанию для isTableView на «false», произойдет то же самое поведение, за исключением представления списка, однако при отображении представления списка я могу нажать кнопку изменения представления, и значок переключения представления изменится. но он возвращается к состоянию «пустой список», и значок переключателя меняется, но мне все равно приходится повторно переходить на главный экран, чтобы снова открыть представление списка. Я предполагаю, что у меня что-то не так с представлением таблицы (это maven Central oleksandrbalan/lazytable, который я получил от gitHub).
Я пробовал поменять код местами и изменить некоторые порядки, но Я не могу понять, как это сломалось, я играл с этим две недели и не могу понять.
Итак, я собираюсь дать то, что я есть. Предполагается, что это весь соответствующий код, но если необходимо просмотреть другой код, я могу отредактировать его и добавить его. Например, я не включил код конструкции для режима просмотра таблицы или списка или чего-то еще, но он включен та же страница ниже.
[b]HomeScreen:[/b]
fun HomeScreen(
navigateToHome: () -> Unit,
navigateToStats: () -> Unit,
navigateToAddEntry: () -> Unit,
navigateToEditEntry: (Int) -> Unit,
modifier: Modifier = Modifier,
viewmodel: HomeViewModel = viewModel(factory = AppViewModelProvider.Factory),
) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
val homeUiState by viewmodel.homeUiState.collectAsState()
val items = homeUiState.items
val isTableView = homeUiState.isTableView
Scaffold(
modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
CellarTopAppBar(
title = stringResource(HomeDestination.titleRes),
scrollBehavior = scrollBehavior,
canNavigateBack = false,
)
},
bottomBar = {
CellarBottomAppBar(
modifier = Modifier
.padding(0.dp),
navigateToHome = navigateToHome,
navigateToStats = navigateToStats,
navigateToAddEntry = navigateToAddEntry,
)
},
) { innerPadding ->
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top,
modifier = Modifier
.fillMaxSize()
.padding(top = 64.dp, bottom = 66.dp, start = 0.dp, end = 0.dp)
) {
HomeHeader(
homeUiState = homeUiState,
selectView = viewmodel::selectView,
isTableView = isTableView,
)
HomeBody(
homeUiState = homeUiState,
items = items,
isTableView = isTableView,
onItemClick = navigateToEditEntry,
modifier = modifier
.fillMaxWidth()
.padding(0.dp),
contentPadding = innerPadding,
)
}
}
}
@Composable
private fun HomeHeader(
modifier: Modifier = Modifier,
homeUiState: HomeUiState,
selectView: (Boolean) -> Unit,
isTableView: Boolean,
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
//Switch table/list view//
Text(
text ="View:",
textAlign = TextAlign.Start,
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
modifier = Modifier
.padding(0.dp)
)
IconButton(
onClick = { selectView(!isTableView) },
modifier = Modifier
.padding(2.dp)
.size(28.dp)
.align(Alignment.Bottom)
) {
Icon(
painter = painterResource(homeUiState.toggleIcon),
contentDescription = stringResource(homeUiState.toggleContentDescription),
tint = MaterialTheme.colorScheme.onBackground,
modifier = Modifier
.size(24.dp)
.padding(0.dp)
)
}
}
}
@Composable
private fun HomeBody(
modifier: Modifier = Modifier,
homeUiState: HomeUiState,
items: List,
isTableView: Boolean,
onItemClick: (Int) -> Unit,
contentPadding: PaddingValues = PaddingValues(0.dp),
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top,
modifier = Modifier
.fillMaxWidth()
.padding(0.dp)
) {
if (items.isEmpty()) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
modifier = Modifier
.fillMaxSize()
) {
Text(
text = stringResource(R.string.no_items),
textAlign = TextAlign.Center,
style = MaterialTheme.typography.titleLarge,
modifier = Modifier
.padding(0.dp),
)
}
}
else {
if (isTableView) {
TableViewMode(
itemsList = homeUiState.items,
contentPadding = contentPadding,
modifier = Modifier
.padding(0.dp),
)
}
else {
ListViewMode(
itemsList = homeUiState.items,
onItemClick = { onItemClick(it.id) },
contentPadding = contentPadding,
modifier = Modifier
.padding(0.dp)
.fillMaxWidth()
)
}
}
}
}
@Composable
fun TableViewMode(
itemsList: List,
contentPadding: PaddingValues,
modifier: Modifier = Modifier,
){
CellarLazyTable(
itemsTbl = itemsList,
contentPadding = contentPadding,
modifier = modifier
.fillMaxWidth()
.padding(0.dp)
)
}
@Composable
fun ListViewMode(
itemsList: List,
onItemClick: (Items) -> Unit,
contentPadding: PaddingValues = PaddingValues(0.dp),
modifier: Modifier = Modifier,
){
LazyColumn(
modifier = modifier
.fillMaxWidth()
.padding(0.dp),
){
items(items = itemsList, key = { it.id }) { item ->
CellarListItem(
item = item,
modifier = Modifier
.padding(0.dp)
.clickable {
onItemClick(item)
}
)
}
}
}
[b]HomeViewModel:[/b]
class HomeViewModel(
itemsRepository: ItemsRepository,
private val preferencesRepo: PreferencesRepo
): ViewModel() {
companion object {
private const val TIMEOUT_MILLIS = 5_000L
}
val homeUiState: StateFlow =
merge(
itemsRepository.getAllItemsStream().map { HomeUiState(it) },
preferencesRepo.isTableView.map { isTableView -> HomeUiState(isTableView = isTableView) },
).stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(TIMEOUT_MILLIS),
initialValue = HomeUiState()
)
/* Toggle Cellar View */
fun selectView(isTableView: Boolean) {
viewModelScope.launch {
preferencesRepo.saveViewPreference(isTableView)
}
}
}
data class HomeUiState(
val items: List = listOf(),
val isTableView: Boolean = true,
val toggleContentDescription: Int =
if (isTableView) R.string.list_view_toggle else R.string.table_view_toggle,
val toggleIcon: Int =
if (isTableView) R.drawable.list_view else R.drawable.table_view,
)
Подробнее здесь: [url]https://stackoverflow.com/questions/78802395/android-compose-using-merged-viewmodel-ui-and-state-issues-function-breaking-a[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия