Lambda parameter causes recomposition

41 views Asked by At

When passing lambda to button's onClick, it triggers recomposition every time parent is recomposed.

I somewhat understand why that happens, because for lambda is just object of a class and if it contains unstable variables, it will trigger recomposition.

fun mainScreenDestination(
    viewModel: MainViewModel.ViewModel = hiltViewModel()
) {
   HomeScreenHeader(
      title = //some mutable data
      onStatsClick = {
             viewModel.onStatsClicked()
          }
    )
}


@Composable
fun HomeScreenContent(
    modifier: Modifier = Modifier,
    title: String,
    onStatsClick: () -> Unit = {}
) {
    Button(
          onClick = onStatsClick,
          .....
     ){}

   Text(text = title)
}
  1. So the solution I find everywhere is to pass reference to the function as a parameter, but result is same for me, why doesn't it work?
fun mainScreenDestination(
    viewModel: MainViewModel.ViewModel = hiltViewModel()
) {
   HomeScreenHeader(
      title = //some mutable data
      onStatsClick = viewModel::onStatsClicked
    )
}
  1. And the next solution is to remember lambda in composition context and pass it as
 val onStatsClicked = remember<() -> Unit> { viewModel::onStatsClicked}

even tho this works what are the alternatives, because I dont want to "remember" all the needed lambdas

0

There are 0 answers