I have a filter dialog that shows filter options :
When I click on "Parent Platform" section I'm navigating to the PlatformsScreen
with two arguments. Argument one is parent
which is int and the second is platforms which is an array of int :
sealed class Screen(val route: String, val arguments: List<NamedNavArgument>) {
object PlatformScreen : Screen(PLATFORM_ROUTE,arguments =
listOf(navArgument("parent", builder = {type = NavType.IntType}),
navArgument("platforms",builder = {type = NavType.IntArrayType})))
}
// click action
@Composable
fun FilterDialog(
modifier: Modifier = Modifier,
viewModel: FilterViewModel,
navigateToPlatformScreen: (Int,Array<Int?>) -> Unit
) {
val filterState by viewModel.filterState.collectAsState()
Row(//other stuff
.clickable {
navigateToPlatformScreen(filterState.parentPlatform?.id ?: -1,
filterState.platforms?.map { it?.id }?.toTypedArray() ?: arrayOf(-1))
}
)
//here is my filter bottom sheet
bottomSheet(route = FILTER_ROUTE) {
FilterDialog(viewModel = viewModel,
navigateToPlatformScreen = { parentId,platforms ->
navController.navigate("${Screen.PlatformScreen.route}?parent=${parentId}&platforms=${platforms}")
})
}
//platforms screen
bottomSheet(route = Screen.PlatformScreen.route+"?parent={parent}&platforms={platforms}",arguments = Screen.PlatformScreen.arguments) { backstackEntry ->
val parent = backstackEntry.arguments?.getInt("parent")
val platforms = backstackEntry.arguments?.getIntArray("platforms")
PlatformScreen(parent = parent,platforms = platforms)
}
And as the last part, here is my FilterViewModel
that holds my parentId
and platforms
array :
class FilterViewModel : ViewModel() {
private val _selectedParentPlatform = MutableStateFlow<ParentPlatform?>(ParentPlatform())
private val _filterState = MutableStateFlow(FilterState())
val filterState:StateFlow<FilterState> get() = _filterState
init {
viewModelScope.launch {
_selectedParentPlatform.mapLatest {
FilterState(
parentPlatform = it,
platforms = it?.platforms
)
}
.catch { cause ->
}
.collectLatest {
_filterState.value = it
}
}
}
}
I have no problem with parent
argument. I can pass it with no problem however the array type causing a crash with the following error:
java.lang.UnsupportedOperationException: Arrays don't support default values.