jetc.dev Newsletter Issue #270
Published: 2025-06-24
Not only did we get a new Compose production patch release, but we got our first
beta of 1.9.0
and some new Compose libraries besides!
Beyond that, we peek at edge-to-edge (on iOS!) and TextFieldState
. We learn about
Nav3 and Androidify. We explore creating an OTP field and how to render text along a
path. And we integrate Rive animations in Compose Multiplatform.
Ooooo… What Did We Get?
Reviewing the release notes for the latest Jetpack Compose update!
The production and beta Compose BOMs are up to 2025.06.01
. The production BOM points
to version 1.8.3
for the primary Compose artifacts, with
a couple of bug fixes
and little else.
The beta BOM is now for 1.9.0-beta01
, which is surprising considering that 1.9.0-alpha01
is barely two months old. Of note:
-
background()
andborder()
modifiers now implementSemanticsModifierNode
, which may affect some of your tests -
There is a new
rememberSerializable()
function, that works akin torememberSaveable()
but is powered bykotlinx.serialization
-
InsetsRulers
was moved to common code and renamedWindowInsetsRulers
The Compose Runtime gained support for many new platforms:
androidx.compose.runtime:runtime-annotation-js
androidx.compose.runtime:runtime-annotation-mingwx64
androidx.compose.runtime:runtime-iosarm64
androidx.compose.runtime:runtime-iossimulatorarm64
androidx.compose.runtime:runtime-iosx64
androidx.compose.runtime:runtime-js
androidx.compose.runtime:runtime-linuxarm64
androidx.compose.runtime:runtime-linuxx64
androidx.compose.runtime:runtime-macosarm64
androidx.compose.runtime:runtime-macosx64
androidx.compose.runtime:runtime-mingwx64
androidx.compose.runtime:runtime-tvosarm64
androidx.compose.runtime:runtime-tvossimulatorarm64
androidx.compose.runtime:runtime-tvosx64
androidx.compose.runtime:runtime-watchosarm32
androidx.compose.runtime:runtime-watchosarm64
androidx.compose.runtime:runtime-watchosdevicearm64
androidx.compose.runtime:runtime-watchossimulatorarm64
androidx.compose.runtime:runtime-watchosx64
Wear Compose is up to 1.5.0-beta04
, with a lot of bug fixes.
The Jetpack Ink set of libraries now has a Compose-based UI layer:
androidx.ink:ink-authoring-compose
androidx.ink:ink-authoring-compose-android
androidx.ink:ink-brush-compose
androidx.ink:ink-brush-compose-android
androidx.ink:ink-geometry-compose
androidx.ink:ink-geometry-compose-android
The NavigationEvent set of libraries now has a Compose flavor:
androidx.navigationevent:navigationevent-compose
androidx.navigationevent:navigationevent-compose-android
androidx.navigationevent:navigationevent-compose-jvmstubs
androidx.navigationevent:navigationevent-compose-linuxx64stubs
Also, androidx.activity:activity-compose:1.12.0-alpha03
was released.
In addition, JetBrains released 1.8.2
of Compose Multiplatform, with
a bunch of bug fixes.
One Off the Stack, One Off the Slack
You’ve got questions. That’s understandable!
How Do I Go Edge-to-Edge… in iOS?
Android developers have been dealing with edge-to-edge UI presentations for some time.
But, what if you are using Compose Multiplatform, and you want to match that presentation
on iOS? See how to tweak ContentView.swift
to get what you are seeking in this week’s
highlighted Stack Overflow question.
Should TextFieldState
Go In Our ViewModel
?
Keeping all your state in a ViewModel
sounds great, but testing TextViewState
becomes tricky. Learn some testing workarounds for this scenario, and a bit about
the future of this issue, in this week’s highlighted Kotlinlang #compose
Slack thread.
KotlinConf 2025
Not surprisingly, KotlinConf 2025 had several presentations regarding Compose and Compose Multiplatform, including:
- Building Inclusive Jetpack Compose Apps: Leveraging Kotlin and the Accessibility Scanner
- Compose draw speedrun - reloaded
- Compose Multiplatform for iOS: Ready for Production Use
- Creative UIs with Compose
- Implementing Compose Hot Reload
- State of Kotlin/Wasm and Compose Multiplatform for Web on Modern Browsers
Composable Commentary
Posts, videos, and other new information related to Jetpack Compose!
Video: Navigating the future with Jetpack Navigation 3 - Core Concepts
Google’s Jeremy Woods gives us a quick 10-minute tour of the new Nav3 library, particularly how it puts the backstack under your control.
Video: All about Androidify
Google’s Rebecca Franks (Mastodon, Bluesky) and Roberto Orgiu joined the Code with the Italians team to talk about the latest incarnation of Androidify, especially its Compose-based UI. From Material 3 Expressive to adaptive layouts, see how Google is powering this new, droidful app. And, yes, of course “droidful” is a word!
Medium: Future Of Android: Why Navigation 3 is a Game-Changer!
Medium user ashiqfury gives us an extended walkthrough of Nav3, from basic setup through scenes and strategies, transitions, and more.
Medium: Creating an OTP Text View with Auto-Fill Support in Jetpack Compose
There are many OTP composable libraries.
Karishma Agrawal shows how to create one, complete with autofill support, leveraging
the flexibility of BasicTextField()
.
Medium: Migrating a Custom EditText to Jetpack Compose (Without Breaking Focus Navigation)
Sometimes you have so much invested in a View
that you need an interim hybrid solution
blending Compose and the View
-based system. This gets extra-tricky when it comes to
focus, which is fairly important if your View
is a highly-customized EditText
.
Yusuf Önder shows us the limitations of focus and AndroidView()
and helps us work
around those limitations.
Material 3 Expressive for Compose: Loading Indicator
Joe Birch
(Mastodon)
has begun a blog post series examining Material 3 Expressive. This week’s
post looks at LoadingIndicator()
, providing you an animated rotating polygon to let
the user know that your app is busy loading some data.
Animating Text along a Path in Jetpack Compose
sinasamaki
(Mastodon, Bluesky)
is back, showing us how to render text on a Canvas()
, following a Path
,
including rotating the characters to be perpendicular to the line represented by
the Path
.
Other Interesting Links
- Medium: Best Practices for Building Adaptive UIs with Jetpack Compose
- Medium: How BoxWithConstraints Saved My Compose Layout: Solving Nested LazyColumn and HorizontalPager Height Issues
- Medium: Mastering
rememberCoroutineScope()
in Jetpack Compose: Real-World Examples, Best Practices & 30+ Interview Q&As - Medium: Understanding Side Effects in Jetpack Compose: What, Why, and How to Use Them Right
- Medium: Understanding Weight vs Fraction in Jetpack Compose: When Size Matters
Resource Roundup
100% pure code!
GitHub: muazkadan / Rive-CMP
Muaz Kadan has created a Compose Multiplatform wrapper around native libraries for rendering Rive animations, supporting Android and iOS.
GitHub: sunildhiman90 / KotlinMultiplatformAuth
Sunil Kumar is working on a authentication framework for Compose Mulitplatform, supporting all platforms. Presently, it wraps Sign In with Google.
GitHub: ernestoyaquello / DragDropSwipeLazyColumn
Julio Ernesto Rodríguez Cabañas published a wrapper around LazyColumn()
that adds
item drag-and-drop capabilities, along with horizontal swipe actions.
GitHub: shivvrat12 / markdown-compose
Shiv Vrat Raghuvanshi brings us a MarkdownText()
composable supporting basic
Markdown rendering.
Composer
The Firebender team has published “an autonomous coding agent that takes any Figma design URL and converts it to near pixel-perfect Jetpack Compose code”.
Notable Releases
Compose Unstyled is up to 1.33.0
,
with some BottomSheet()
improvements and new slot APIs for a variety of the library’s
composables.
Or, you can subscribe to the Atom feed or follow Mark Murphy in the Fediverse.
Recent Issues:
- 2025-06-10: Compose and Compose Multiplatform alphas! Material3 Expressive! Lottie testing! Cross-platform ripples! And... *now* can we pick a peck of pickle photos?!?
- 2025-06-03: Navigation for Compose! What's new in Compose! Accessibility testing! Snackbars and channels! Overscroll! And... can we tie a ribbon on it?!?
- 2025-05-27: Google I|O 2025! KotlinConf 2025! Compose and Compose Multiplatform updates! Motion physics in Material3 Expressive!