CONSUMIR STATE DESDE BADGE BOX JETPACK COMPOSE + VIEWMODEL+ STATEFLOW

14 views
Skip to first unread message

Ivan Medina

unread,
Feb 15, 2025, 9:50:52 AMFeb 15
to desarrolladores-android
estoy usando compose y para esto tengo un viewmodel que consulta un DAO (por el momento no he abstraido en repositorio) este dao devuelve lo que necesita la vista y el viewmodel se encarga de hacer los flujos hacia la UI con StateFlows

aqui un pedazo de la UI de Navegacion donde he atomizado todo para poder verlo a detalle en otro lado tengo implementado un for y una lista con esos mismos BottomNavItem

entonces en la propiedad del Badge que hace alusion a la cuenta de notificaciones simplemente no recompone nada y se salta las composiciones

he hecho de todo, si alguien puede ayudar y dar luz sobre como mostrar notificaciones de forma correcta en el BottomBar con NavigationBar y NavigationBarItem agradeceria el comentario

dejo el codigo


@Composable
fun BottomNavigationBar(
currentRoute: String, // The current route to determine the selected item
onItemClick: (String) -> Unit, // Callback for item clicks
cartViewModel: CartViewModel = hiltViewModel()
) {
val count by cartViewModel.totalItemsInCart.collectAsState()
Log.d("INITIALCOUNTUI", "$count")

///region BottomNavItems
val cartItem = BottomNavItem(
route = Route.CART.name,
selectedIcon = R.drawable.ic_cart_filled,
unselectedIcon = R.drawable.ic_cart,
title = "Cart",
hasNewValue = false,
badgeCount = 0
)

val homeItem = BottomNavItem(
route = Route.HOME.name,
selectedIcon = R.drawable.ic_homefood,
unselectedIcon = R.drawable.ic_homefood,
title = "Home",
hasNewValue = false,
badgeCount = null
)

val ordersItem = BottomNavItem(
route = Route.MYORDERS.name,
selectedIcon = R.drawable.ic_orders,
unselectedIcon = R.drawable.ic_orders,
title = "MisOrdenes",
hasNewValue = false,
badgeCount = null
)

val favoritesItem = BottomNavItem(
route = Route.FAVORITES.name,
selectedIcon = R.drawable.ic_favorite_filled,
unselectedIcon = R.drawable.ic_favorite_outlined,
title = "Favoritos",
hasNewValue = false,
badgeCount = null
)
///endregion
NavigationBar(
containerColor = Colours.salmonCarmesi,
contentColor = Colours.riceGray
) {
// Cart Item
NavigationBarItem(
colors = NavigationBarItemColors(
selectedIconColor = Colours.pinkRol,
selectedTextColor = Colours.riceGray,
selectedIndicatorColor = Colours.salmonCarmesi,
unselectedIconColor = Colours.riceGray,
unselectedTextColor = Colours.riceGray,
disabledIconColor = Colours.unselectedRed,
disabledTextColor = Colours.ghostGrey
),
icon = {
if (count > 0 ) {
BadgedBox(
badge = {
Badge {
Text(
text = count.toString(),
modifier = Modifier.semantics {
contentDescription = "${cartItem.title} new items"
}
)
}
}
) {
Icon(
imageVector = ImageVector.vectorResource(
id = if (currentRoute == cartItem.route) cartItem.selectedIcon else cartItem.unselectedIcon
),
contentDescription = cartItem.title
)
}
} else {
Icon(
imageVector = ImageVector.vectorResource(
id = if (currentRoute == cartItem.route) cartItem.selectedIcon else cartItem.unselectedIcon
),
contentDescription = cartItem.title
)
}
},
label = { Text(
text = ordersItem.title,
color = Colours.sweetCream,
fontSize = 12.sp,
fontWeight = FontWeight.Light
)},
selected = currentRoute == cartItem.route,
onClick = { onItemClick(cartItem.route) }
)

// Home Item
NavigationBarItem(
colors = NavigationBarItemColors(
selectedIconColor = Colours.pinkRol,
selectedTextColor = Colours.riceGray,
selectedIndicatorColor = Colours.salmonCarmesi,
unselectedIconColor = Colours.riceGray,
unselectedTextColor = Colours.riceGray,
disabledIconColor = Colours.unselectedRed,
disabledTextColor = Colours.ghostGrey
),
icon = {
Icon(
imageVector = ImageVector.vectorResource(
id = if (currentRoute == homeItem.route) homeItem.selectedIcon else homeItem.unselectedIcon
),
contentDescription = homeItem.title
)
},
label = { Text(
text = ordersItem.title,
color = Colours.sweetCream,
fontSize = 12.sp,
fontWeight = FontWeight.Light
)},
selected = currentRoute == homeItem.route,
onClick = { onItemClick(homeItem.route) }
)

// Orders Item
NavigationBarItem(
colors = NavigationBarItemColors(
selectedIconColor = Colours.pinkRol,
selectedTextColor = Colours.riceGray,
selectedIndicatorColor = Colours.salmonCarmesi,
unselectedIconColor = Colours.riceGray,
unselectedTextColor = Colours.riceGray,
disabledIconColor = Colours.unselectedRed,
disabledTextColor = Colours.ghostGrey
),
icon = {
Icon(
imageVector = ImageVector.vectorResource(
id = if (currentRoute == ordersItem.route) ordersItem.selectedIcon else ordersItem.unselectedIcon
),
contentDescription = ordersItem.title
)
},
label = { Text(
text = ordersItem.title,
color = Colours.sweetCream,
fontSize = 12.sp,
fontWeight = FontWeight.Light
)},
selected = currentRoute == ordersItem.route,
onClick = { onItemClick(ordersItem.route) }
)

// Favorites Item
NavigationBarItem(
colors = NavigationBarItemColors(
selectedIconColor = Colours.pinkRol,
selectedTextColor = Colours.riceGray,
selectedIndicatorColor = Colours.salmonCarmesi,
unselectedIconColor = Colours.riceGray,
unselectedTextColor = Colours.riceGray,
disabledIconColor = Colours.unselectedRed,
disabledTextColor = Colours.ghostGrey
),
icon = {
Icon(
imageVector = ImageVector.vectorResource(
id = if (currentRoute == favoritesItem.route)
favoritesItem.selectedIcon
else
favoritesItem.unselectedIcon
),
contentDescription = favoritesItem.title
)
},
label = { Text(
text = ordersItem.title,
color = Colours.sweetCream,
fontSize = 12.sp,
fontWeight = FontWeight.Light
)
},
selected = currentRoute == favoritesItem.route,
onClick = { onItemClick(favoritesItem.route) }
)
}
}

y una imagen de donde van las notificaciones

01.png

saludos de antemano

David Faerman

unread,
Feb 15, 2025, 2:32:27 PMFeb 15
to desarrollad...@googlegroups.com
esta línea:

Log.d("INITIALCOUNTUI", "$count")
la vez en el logcat? ¿cuándo cambia lo ves? 

quise probar meter el valor dentro del content de otro composable y funciona... 
chequea el viewmodel
para probar en el viewmodel hice esto
private val _bla: MutableStateFlow<Int> = MutableStateFlow(0)
val bla: StateFlow<Int> = _bla
fun startCounter() {
viewModelScope.launch(Dispatchers.Default) {
while (true){
_bla.value++
delay(500)
}
}
}


fijate si ves en el logcat la línea de log, para ver si el problema está en el viewmodel o en la ui. 
igual podrias hacer mas metodos y simplificar un poco ese codigo...

--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/desarrolladores-android/91029b75-8bfc-42ae-8d55-bdd61025c17cn%40googlegroups.com.


--
 (\__/)
(='.'=)This is Bunny. Copy and paste bunny into your
(")_(")signature to help him gain world domination.
Reply all
Reply to author
Forward
0 new messages