Dovydas
03/09/2025, 12:07 PMpagerState.calculateCurrentOffsetForPage
changes very frequently. Am I doing something wrong?
@Composable
actual fun NativeAppTopBar(
modifier: Modifier,
pagerState: PagerState
) {
val coroutineScope = rememberCoroutineScope()
val factory = LocalNativeViewFactory.current
val appTabs = AppTabs.entries.map { it.label.asString() }
UIKitViewController(
modifier = modifier.statusBarsPadding(),
factory = {
println("rebuilt")
factory.createAppTopBarView(
currentOffsetForPage = { pagerState.calculateCurrentOffsetForPage(it) },
onClick = { coroutineScope.launch { pagerState.animateScrollToPage(it) } },
appTabs = appTabs
)
}
)
}
Vidmantas Kerbelis
03/09/2025, 8:22 PMpagerState.calculateCurrentOffsetForPage(it)Is called inside of a lambda
currentOffsetForPage = { pagerState.calculateCurrentOffsetForPage(it) },So, it should only recompose where the lambda is invoked. Try putting something that recomposes directly in the factory = {} lambda instead of an inner one, e.g. right after the println, see how it behaves.
Dovydas
03/09/2025, 8:43 PMfactory = {
val test = pagerState.currentPageOffsetFraction
println("rebuilt")
factory.createAppTopBarView(
currentOffsetForPage = { test },
onClick = { coroutineScope.launch { pagerState.animateScrollToPage(it) } },
appTabs = appTabs
)
}
it still doesnt recompose...Dovydas
03/09/2025, 8:47 PM@Composable
actual fun NativeAppTopBar(
modifier: Modifier,
pagerState: PagerState
) {
NativeAppTopBar(
modifier = modifier,
pagerState = pagerState,
pagerStateCurrentPageOffsetFraction = pagerState.currentPageOffsetFraction
)
}
@Composable
fun NativeAppTopBar(
modifier: Modifier,
pagerState: PagerState,
pagerStateCurrentPageOffsetFraction: Float
) {
println("recomp")
val coroutineScope = rememberCoroutineScope()
val factory = LocalNativeViewFactory.current
val appTabs = AppTabs.entries.map { it.label.asString() }
UIKitViewController(
modifier = modifier.statusBarsPadding(),
factory = {
pagerStateCurrentPageOffsetFraction
val test = pagerState.currentPageOffsetFraction
println("rebuilt")
factory.createAppTopBarView(
currentOffsetForPage = { test },
onClick = { coroutineScope.launch { pagerState.animateScrollToPage(it) } },
appTabs = appTabs
)
},
update = { viewController ->
println("updated")
viewController.view.setNeedsDisplay()
}
)
}
Vidmantas Kerbelis
03/10/2025, 7:57 AMAndroidView
, all of the recompositions happen only in the update
block.
So, you have to restructure your code in a way that you would be able to update the AppTopBarView using the viewController
from the update
blockDovydas
03/10/2025, 10:53 AMupdate
block update? Because in my above example, NativeAppTopBar
gets recomposes ("recomp" gets printed), but "updated" doesn't print.