首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jetpack Compose -恢复LazyColumn滚动状态

Jetpack Compose -恢复LazyColumn滚动状态
EN

Stack Overflow用户
提问于 2021-07-21 18:25:28
回答 1查看 511关注 0票数 1

我有一个包含多个LazyRowLazyColumn。用旧的术语来说,就是嵌套的RecyclerView。

我的问题是,当移动到新的composable (不同的标签)时,LazyColumn不能恢复滚动状态。但是内部LazyRow会恢复它们的状态。

例如,打开主页屏幕,滚动到底部,然后滚动LazyRow结束,然后打开不同的选项卡并再次返回主页选项卡。LazyColumn从顶部开始(不恢复状态),但最后一次LazyRow恢复它的滚动状态。

包含LazyColumn的HomeScreen

代码语言:javascript
复制
@Composable
fun HomeScreen(
    homeViewModel: HomeViewModel = hiltViewModel()
) {

    val scrollState = rememberLazyListState()

    LazyColumn(contentPadding = PaddingValues(vertical = 8.dp),
        horizontalAlignment = Alignment.Start,
        verticalArrangement = Arrangement.spacedBy(8.dp),
        state = scrollState,
        modifier = Modifier
            .fillMaxSize()
            .background(MaterialTheme.colors.background)
    ) {
        items(5) {
            TopRatedProducts(homeViewModel = homeViewModel)
        }
    }
}

包含LazyRow的TopRatedProducts

代码语言:javascript
复制
@Composable
fun TopRatedProducts(
    homeViewModel: HomeViewModel = hiltViewModel()
) {
    val topRatedProducts by rememberFlowWithLifecycle(homeViewModel.topRatedProducts)
        .collectAsState(initial = emptyList())

    LazyRow(
        contentPadding = PaddingValues(horizontal = 8.dp), // Space between start and end
        verticalAlignment = Alignment.CenterVertically,
        horizontalArrangement = Arrangement.spacedBy(8.dp), // Space between items
        modifier = Modifier
            .background(Color.Green)
    ) {
        items(topRatedProducts) {
            ProductCardItem(item = it)
        }
    }
}

如何恢复LazyColumn滚动状态?

EN

回答 1

Stack Overflow用户

发布于 2021-08-23 15:41:22

当你想在片段中使用ComposeView时,你应该提到ViewCompositionStrategy

代码语言:javascript
复制
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return ComposeView(requireContext()).apply {
        // Dispose the Composition when viewLifecycleOwner is destroyed
        setViewCompositionStrategy(
            ViewCompositionStrategy.DisposeOnLifecycleDestroyed(viewLifecycleOwner)
        )
        setContent {
            // content
        }
    }
}

From docs:默认情况下,只要视图从窗口分离,Compose就会处理组合。编写UI视图类型(如ComposeView和AbstractComposeView )使用定义此行为的ViewCompositionStrategy。

默认情况下,Compose使用DisposeOnDetachedFromWindow策略。但是,在使用合成UI视图类型时,在某些情况下可能不需要此默认值:

  • 片段。要保存状态,合成UI视图类型的合成必须遵循片段的视图生命周期。

  • 转换。每当合成UI视图用作过渡的一部分时,它将在过渡开始时(而不是在过渡结束时)与其窗口分离,从而使您的合成视图在仍在屏幕上时释放其状态。

  • RecyclerView视图持有者,或您自己的生命周期管理的自定义视图

文档链接:https://developer.android.com/jetpack/compose/interop/interop-apis#composition-strategy

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68467896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档