如何在 Android 的 Jetpack Compose 中使用 NavGraph 在重新组合之间保持列表状态?

时间:2021-05-29 09:12:34

标签: android android-jetpack-compose

我应该怎么做才能让我的可组合在导航回列表时记住它的状态?

如果我理解正确,当“向下”导航时,组合物被另一个替换,所以当“向上”/返回时,它将创建一个新的,如果我想在那种情况下坚持下去,我必须提升那个值.

问题是,如果一切都是我父母的财产,我不明白如何保持干净的架构,在这种情况下,活动持有 NavHost 和 NavGraph 的 composables

我一直在寻找 Jetnews 示例,但他们没有将任何内容提升到 NavGraph 级别,那么他们是如何使列表保持在同一位置的?

  • 活动
val navController = rememberNavController()

NavHost(
    navController = navController,
    startDestination = NavigationScreens.Launcher.route
) {
    composable(NavigationScreens.Home.route) {
        val viewModel = hiltViewModel<DealsViewModel>(backStackEntry = it)
        HomeScreen(viewModel) { game ->
            navController.putArgument(NavigationScreens.Pdp.Args.game, game)
            navController.navigate(NavigationScreens.Pdp.route)
        }
    }
}
  • 视图模型
@HiltViewModel
class DealsViewModel @Inject constructor(
    private val fetchGameDealsUseCase: FetchGameDealsUseCase,
    private val dispatcherProvider: DispatcherProvider
) : ViewModel() {

    private val scope = CoroutineScope(dispatcherProvider.io)

    val deals = fetchGameDealsUseCase().cachedIn(scope)
}
  • 主屏幕
Scaffold(
        scaffoldState = scaffoldState
    ) {
        Box(modifier = Modifier.fillMaxSize()) {
            SearchField()
            DealsScreen(
                deals = viewModel.deals,
                contentPadding = PaddingValues(top = 84.dp),
                onItemClick = onItemClick
            )
        }
    }
  • 交易屏幕
fun DealsScreen(
    modifier: Modifier = Modifier,
    contentPadding: PaddingValues = PaddingValues(0.dp),
    deals: Flow<PagingData<Game>>,
    onItemClick: (Game) -> Unit,
) {
    val nColumns = 3
    val content = deals.collectAsLazyPagingItems()

    LazyVerticalGrid(
        cells = GridCells.Fixed(nColumns),
        modifier = Modifier
            .fillMaxSize()
            .composed { modifier },
        contentPadding = contentPadding,
    ) {
        items(content) { game ->
            game?.let {
                DealsContent(game, onItemClick)
            }
        }
    }
}

我注意到我的代码和他们的代码之间的主要区别是他们不收集关于可组合的数据,而是使用生产者,在这种情况下我不知道该怎么做,因为我使用的是collectAsLazyPagingItems。有没有人对此有解决方案?

完整代码可在 https://github.com/Danil0v3s/wishlisted-android/tree/compose

编辑:我发现实际上有一个 bug,当 collectAsLazyPagingItems 在 NavHost 中使用时,可组合默认列表为初始位置

0 个答案:

没有答案