jetc.dev Newsletter Issue #281
Published: 2025-09-16
We got a new Compose patch release, a new Compose alpha, new Wear Compose releases, and a Compose Multiplatform RC!
Beyond those, we see what “remote Compose” is and consider the new visibility APIs. Plus, we
render composables without an Activity
and look at a multiplatform biometrics UX wrapper.
Ooooo… What Did We Get?
Reviewing the release notes for the latest Jetpack Compose update!
The Compose BOMs are up to 2025.09.00
. The production BOM mostly points to 1.9.1
,
which contains bug fixes. The alpha BOM mostly points to 1.10.0-alpha03
, which contains
a lot of under-the-covers improvements but seemingly little to affect the commonly-used
public API.
Similarly, Wear Compose had a pair of releases. 1.5.1
contains bug fixes, while
1.6.0-alpha01
, which adds:
- Non-clickable card implementations
- A new minutes-and-seconds
TimePicker()
, skipping the hour column - Bug fixes
We also got a bunch of Compose-adjacent updates, including:
androidx.activity:activity-compose:1.11.0
androidx.activity:activity-compose:1.12.0-alpha08
androidx.camera:camera-compose:1.5.0
androidx.camera.viewfinder:viewfinder-compose:1.5.0
androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0
androidx.hilt:hilt-navigation-compose:1.3.0
androidx.navigation:navigation-compose:2.9.4
androidx.navigation:navigation-compose-android:2.9.4
androidx.navigation:navigation-compose-jvmstubs:2.9.4
androidx.navigation:navigation-compose-linuxx64stubs:2.9.4
androidx.navigation:navigation-fragment-compose:2.9.4
androidx.navigationevent:navigationevent-compose:1.0.0-alpha08
androidx.navigationevent:navigationevent-compose-android:1.0.0-alpha08
androidx.navigationevent:navigationevent-compose-jvmstubs:1.0.0-alpha08
androidx.navigationevent:navigationevent-compose-linuxx64stubs:1.0.0-alpha08
androidx.paging:paging-compose:3.4.0-alpha04
androidx.paging:paging-compose-android:3.4.0-alpha04
androidx.paging:paging-compose-desktop:3.4.0-alpha04
androidx.paging:paging-compose-iosarm64:3.4.0-alpha04
androidx.paging:paging-compose-iossimulatorarm64:3.4.0-alpha04
androidx.paging:paging-compose-iosx64:3.4.0-alpha04
androidx.paging:paging-compose-js:3.4.0-alpha04
androidx.paging:paging-compose-linuxarm64:3.4.0-alpha04
androidx.paging:paging-compose-linuxx64:3.4.0-alpha04
androidx.paging:paging-compose-macosarm64:3.4.0-alpha04
androidx.paging:paging-compose-macosx64:3.4.0-alpha04
androidx.paging:paging-compose-mingwx64:3.4.0-alpha04
androidx.paging:paging-compose-tvosarm64:3.4.0-alpha04
androidx.paging:paging-compose-tvossimulatorarm64:3.4.0-alpha04
androidx.paging:paging-compose-tvosx64:3.4.0-alpha04
androidx.paging:paging-compose-wasm-js:3.4.0-alpha04
androidx.paging:paging-compose-watchosarm32:3.4.0-alpha04
androidx.paging:paging-compose-watchosarm64:3.4.0-alpha04
androidx.paging:paging-compose-watchosdevicearm64:3.4.0-alpha04
androidx.paging:paging-compose-watchossimulatorarm64:3.4.0-alpha04
androidx.paging:paging-compose-watchosx64:3.4.0-alpha04
Finally, JetBrains released Compose Multiplatform 1.9.0-rc02
,
containing a few bug fixes.
One Off the Stack, One Off the Slack
You’ve got questions. That’s understandable!
Is TextFieldState
Affected by Recomposition?
State holders are affected by recomposition, the same as everything else. If you are
populating a TextFieldState
from part of some UI state object, if that state changes
(even if the part you reference does not), your code populating the TextFieldState
will recompose. Learn more in this week’s highlighted Stack Overflow question.
What Is “Remote Compose”?
The Compose repository in GitHub has a new remote
directory.
Learn what it contains, and where it might lead Compose for Android development,
in this week’s highlighted Kotlinlang #compose
Slack thread.
DroidKaigi 2025
DroidKaigi 2025 had several presentations related to Compose. Some were in English, including:
Others were in Japanese, including:
- Extending application adaptability: A case study of JetStream
- Hybrid Mobile Apps with Compose Multiplatform and SwiftUI
- Learning Large-Screen Support from the Ground Up
- No More Getting Lost! A Practical Guide to Writing Jetpack Compose
- What We’ve Done to (Plan to) Migrate from Navigation 2 to 3
Composable Commentary
Posts, videos, and other new information related to Jetpack Compose!
Medium: Visibility APIs in Jetpack Compose 1.9: Easier, Cleaner… but Not Quite There Yet
Pablo Costa likes the new onVisibilityChanged()
and onFirstVisible()
modifiers
introduced in Compose 1.9 to find out the visibility of LazyList
items. However, in
testing, Pablo found them to be less reliable than the snapshotFlow()
-based
approach we had to use before.
Medium: Introducing Shaded: A library to bring the compose blur modifier on lower Android APIs
Mohamedd Hassan wanted to use the blur()
modifier, but it only supports API 31 (Android 12)
and higher, leading to the creation of the Shaded library
for Compose for Android to supply a blur()
backport.
Medium: How did we implement Multi-Language support using Jetpack Compose? [Android]
Some apps offer their own in-app language selector, independent from the system language. Shubham Kumar Gupta explores how to implement that sort of UX in Compose for Android, allowing users to select a language, then render the entire app content in that language.
Compose UI without an Activity
ahmed el-helw
(Mastodon)
walks us through how to use a ComposeView
without an Activity
,
with the help of DisplayManager
, Presentation
, and SavedStateRegistryOwner
.
Medium: SnapNotify: How I Simplified Jetpack Compose Snackbars from 15+ Lines to One Line
Vamsi Vaddavalli created the SnapNotify library mentioned in the previous newsletter. In this Medium post, Vamsi explains how to use SnapNotify to replace a lot of snackbar boilerplate code and create powerful snackbars.
Other Interesting Links
- Medium: How to Open Browser in Android & iOS using Jetpack Compose Multiplatform (CMP)
- Medium: How to Understand Modifier Ordering in Jetpack Compose — A Complete Guide
- Medium: Mastering Dark & Light Mode in Kotlin Multiplatform: A Complete Guide
- Medium: MVI Part 1: Why MVI Works Better than MVVM in Jetpack Compose Apps
- Medium: Pizza App Animation in Jetpack Compose
- Medium: Pull-to-Refresh with Animated State
- Medium: Testing in Transition: Navigating Android UI Testing During an XML to Compose Migration
- Medium: The One Rule of State Management in Jetpack Compose You Can’t Ignore
Resource Roundup
100% pure code!
GitHub: kdomskia / kdomskia
The kdomskia has released their eponymous library, a wrapper atop of Compose Multiplatform that makes it easier to create HTML/CSS/JS-based Web apps as peers of Android, iOS, and desktop apps. kdomskia, in turn, is powered by Compose HTML and Kobweb.
GitHub: N7ghtm4r3 / Biometrik
GitHub user N7ghtm4r3 offers a Compose Multiplatform wrapper around platform-specific
biometric authentication UIs, for iOS, Android, Web, and desktop (Windows/Linux/macOS).
Just use the supplied BiometrikAuthenticator()
composable to trigger the biometric
UI for the current platform.
GitHub: Kyant0 / AndroidLiquidGlass
GitHub user Kyant0 created a Compose for Android implementation of a glassmorphic presentation resembling Apple’s Liquid Glass.
GitHub: Neotica / NeoToast
The Neotica team created a toast-style popup UI for Compose Multiplatform, supporting Android, iOS, and desktop.
GitHub: senseiiii12 / SwipeSnack
GitHub user senseiiii12 brings us yet another snackbar implementation for Compose
for Android, powered by a SwipeSnackBox()
container supplying a SwipeStackController
to show the snackbar in that container.
Notable Releases
Maps for Compose is up to 6.10.0
,
adding “a robust Google Maps initializer”. 🤷🏻
Or, you can subscribe to the Atom feed or follow Mark Murphy in the Fediverse.
Recent Issues:
- 2025-09-02: Stable Wear Compose! Compose alpha! Compose Multiplatform RC! Shadows! Nav3! And... why does rotate() behave strangely?!?
- 2025-08-26: Compose 1.9.0! Wear Compose RC! Compose Multiplatform beta! Kobweb! Modifier order! String and icon wrappers! And... why is it tough to remember when and how to remember()?!?
- 2025-08-10: produceState() problems! RetainedEffect()! Compose Unstyled! And... I'm going to be AFTNK (away from this newsletter's keyboard) for a bit!