Timo Drick
09/19/2023, 8:26 AMLazyColumn(
contentPadding = WindowInsets.systemBars.asPaddingValues(),
) {
But this does not consider already consumed insets.
Is there a method to get unconsumed insets?
I looked into the inset modifier api and they use internal variables to keep track of consumed insets.Stylianos Gakis
09/19/2023, 8:31 AMonConsumedWindowInsetsChanged
modifier.
Here’s what I do https://github.com/HedvigInsurance/android/blob/e72564f334bcd3a61d1f62a9eeccc5d63d[…]tlin/com/hedvig/android/feature/home/home/ui/HomeDestination.ktStylianos Gakis
09/19/2023, 8:31 AMTimo Drick
09/19/2023, 8:40 AMTimo Drick
09/19/2023, 8:42 AMStylianos Gakis
09/19/2023, 8:50 AMAnd for the horizontal padding i put it into the normal modifier and not using content padding at allWhat do you mean by “normal” modifier here?
Timo Drick
09/19/2023, 8:53 AMLazyColumn(
modifier = Modifier
.windowInsetsPadding(WindowInsets.systemBars.only(WindowInsetsSides.Horizontal)
)
) {
item {
Spacer(Modifier
.windowInsetsPadding(WindowInsets.systemBars.only(<http://WindowInsetsSides.Top|WindowInsetsSides.Top>))
)
}
items ...
item {
Spacer(Modifier
.windowInsetsPadding(WindowInsets.systemBars.only(WindowInsetsSides.Bottom))
)
}
}
This is my solution but also a little bit too complicated for my taste 😞Timo Drick
09/19/2023, 8:56 AMStylianos Gakis
09/19/2023, 9:00 AMStylianos Gakis
09/19/2023, 9:01 AMcontentPadding
and not applying the horizontal insets to the entire contentStylianos Gakis
09/19/2023, 9:05 AMcontentPadding
, which is discussed here.Timo Drick
09/19/2023, 9:48 AMclass PaddingValueProvider(
val modifier: Modifier
) {
var paddingValues: PaddingValues by mutableStateOf(PaddingValues())
internal set
}
@Composable
fun insetsPaddingValuesProvider(insets: WindowInsets): PaddingValueProvider {
val density = LocalDensity.current
var consumedWindowInsets by remember { mutableStateOf(WindowInsets(0.dp)) }
val provider = remember {
PaddingValueProvider(
modifier = Modifier.onConsumedWindowInsetsChanged {
log("consumedInsets: $it")
consumedWindowInsets = it
}
)
}
LaunchedEffect(Unit) {
snapshotFlow { consumedWindowInsets }.collect {
provider.paddingValues = insets.exclude(consumedWindowInsets).asPaddingValues(density)
log("Padding values: ${provider.paddingValues}")
}
}
return provider
}
Usage looks than like this:
val paddingValueProvider = insetsPaddingValuesProvider(insets = WindowInsets.systemBars)
LazyColumn(
modifier = paddingValueProvider.modifier,
contentPadding = paddingValueProvider.paddingValues
) {
items ...
}
Timo Drick
09/19/2023, 9:49 AMTimo Drick
09/19/2023, 9:50 AMStylianos Gakis
09/19/2023, 9:52 AMTimo Drick
09/19/2023, 9:56 AM@Composable
fun insetsPaddingValues(insets: WindowInsets): PaddingValues {
val density = LocalDensity.current
var paddingValues by remember { mutableStateOf(PaddingValues()) }
Spacer(modifier = Modifier.onConsumedWindowInsetsChanged(
block = {
paddingValues = insets.exclude(it).asPaddingValues(density)
}
))
return paddingValues
}
Usage is than very easy:
LazyColumn(
contentPadding = insetsPaddingValues(insets = WindowInsets.systemBars)
) {
items ...
}
Timo Drick
09/19/2023, 9:57 AMStylianos Gakis
09/19/2023, 9:59 AMPaddingValues
but also at the same time emits some UI by using the Spacer
. I think that’s a big no-no, as mentioned here https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-api-guidelines.md#emit-xor-return-a-valueTimo Drick
09/19/2023, 10:00 AMTimo Drick
09/19/2023, 10:01 AMStylianos Gakis
09/19/2023, 10:03 AMTimo Drick
09/19/2023, 10:04 AMTimo Drick
09/19/2023, 1:13 PMStylianos Gakis
09/19/2023, 1:16 PM