android 如何在使用padding时摆脱重组LazyColumn元素

1wnzp6jl  于 2023-04-04  发布在  Android
关注(0)|答案(1)|浏览(143)

每次TopAppBar折叠和展开时,所有LazyColumn元素都将重新组合多次。

@OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class)
@Composable
fun RoomsScreen(
     viewModel: ScreenViewModel = hiltViewModel()
) {

     val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())

     scaffold(
         modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
         topBar = {
             TopAppBar(
                 scrollBehavior = scrollBehavior
                 ...
             )
         },
     ) { paddingModifier ->

         LazyColumn(
             modifier = Modifier
                 .padding(paddingModifier)
                 .fillMaxSize()
             ,
         ) {
             items(viewModel.list.size) { index ->
                 RoomCard(
                     viewModel = viewModel.list[index],
                 )
             }
         }

     }

}

很明显,当折叠和展开TopAppBar时,paddingModifier会发生变化,并且LazyColumn必须重新构建,但不完全清楚为什么所有嵌套元素都要重新构建(在移动发生时数百次),这极大地浪费了性能。在这种情况下,您会有什么建议?
P.S:如果你使用pinnedScrollBehavior,当然问题就消失了,但这并不是你想要得到的结果

qlvxas9a

qlvxas9a1#

👋🏼 Scaffold填充值可以声明为LazyColumncontentPadding,以避免由于填充值的变化而导致的重组:

LazyColumn(
    modifier = Modifier.fillMaxSize(),
    contentPadding = paddingValues
) { ...

对于content,您可以直接添加列表项,而不是循环列表。此外,您可以为每个项设置唯一的(不同的)key,因此如果项目被重新组合,它不会触发其余项目的重新组合。下面是一个例子:

items(
    items = viewModel.list,
    key = { "room_${it.id}" } // Set a unique key for each item
) { room ->

    RoomCard(room = room)

}

我强烈建议也检查出Layout Inspector
快乐编码!🙌🏼

相关问题