jetc.dev Newsletter Issue #19
Published: 2020-06-23
It was a quiet week in the world of Jetpack Compose, but we still take a peek
at CameraView
, applying Compose to a ViewGroup
, and a new slate of community-created
samples.
One Off the Stack, One Off the Slack
You’ve got questions. That’s understandable!
Using CameraView
in Compose
Someday, perhaps, there will be an official composable API offered by CameraX.
Until then, we need to wrap CameraView
in an AndroidView
and perform quite a few
other hacks to get things working.
Reworking Recomposer
A question about why setContent()
on a ViewGroup
now explicitly requires a Recomposer
parameter led to the discovery that setContent()
might be replaced entirely in a future
Compose release.
Composable Commentary
Posts, videos, and other new information related to Jetpack Compose!
Jetpack Compose: How to Build a Messaging App
Medium user Siva has written an article about how to blend AdapterList
, FloatingActionButton
,
TopAppBar
, and other composables into a UI mimicking that of a conversation-list
messaging app.
jetpackcompose.app
Vinay Gaba is back with a “if this, then that” style of Web site to help you
quickly identify a possible replacement for a classic Android UI construct,
ranging from ProgressBar
and Theme.MaterialComponents
to getDrawable()
and android:background
.
Resource Roundup
100% pure code!
GitHub: Zpecter / MoviesKotlinDemo
Juan Francisco has published a demo app, demonstrating a movie reservation UI.
GitHub: MoIbrahim15 / AndroidComposeSamples
Mohamed Ibrahim has released an app demonstrating a wide range of composables, using a series of Git branches to iterate through the build-out of the UI.
GitHub: henrikhorbovyi / JetpackComposeParkinho
Henrique Horbovyi has another take on the composable-showcase app, demonstrating a couple dozen different composables.
…And One More Thing
An area that we as a community are going to need to work on are tools and techniques to deal with unplanned composition loops.
Such loops were covered in last week’s highlighted Slack thread. It is possible to get yourself into a situation where your composables never stop composing:
-
You call a composable
-
…which updates some state…
-
…which triggers recomposition of that composable…
-
…which updates some state…
-
…which triggers recomposition of that composable…
-
…which updates some state…
-
…which triggers recomposition of that composable…
-
…and so on
Repeatedly causing a composable to be recomposed is normal. As Zach Klippenstein noted,
that is what animations do. Yet, while we want animations, we do not want to burn CPU
cycles constantly having a composable recompose because of pointless state changes.
State seems to be tied to object identity, not content identity, so emitting
a content-equivalent state as a new object, such as via copy()
on a data
class,
could get you in trouble.
The answer might be some sort of ComposeStrictMode
that implements some protections
in debug
builds and skips them in release
builds. For example, there might
be a rule that says “unless otherwise noted, fail if we recompose more than N frames
in succession”, to help identify these sorts of self-recomposing composables.
One way or another, we will need to find some way to help prevent newcomers to Compose (which, right now, is pretty much everyone) from causing themselves too much grief with this sort of problem.
Or, you can subscribe to the Atom feed or follow Mark Murphy in the Fediverse.
Recent Issues:
- 2024-12-10: A Compose Multiplatform alpha! Hot reload! Presentation! Sprites! Calendars!
- 2024-12-03: Rebecca Franks on clipping and masking! Stefano Natali on graphicsLayer()! FunkyMuse on type-safe nav results! And... if we have enough maps, do we need to store our maps in a Map?!?
- 2024-11-26: Math! Shared element transitions! Custom modifiers! Macrobenchmark! Adapting to platform-specific design systems! And... why does wrapContentSize() not wrap my content size?!?