jetc.dev Newsletter Issue #282
Published: 2025-09-23
There’s a new Compose Multiplatform in town!
In addition, we peer into the shadows and put on a mask, all while trying to remain stable. Strangely, Halloween is not for another month. 🎃
Ooooo… What Did We Get?
Reviewing the release notes for the latest Jetpack Compose update!
JetBrains released Compose Multiplatform 1.9.0
! 🎉
This set of release notes
and this blog post
cover the highlights of what we got, including customizable shadows, frame rate configuration
for iOS, better Compose for Web accessibility support, and more.
One Off the Stack, One Off the Slack
You’ve got questions. That’s understandable!
What is the Best Way to Pass Arguments to a Fragment-Wrapped Composable?
When migrating a legacy View
-based app to Compose, you might wind up with a fragment
whose content is largely defined by a composable. You could pass fragment arguments
directly to the composable, or you could hoist them into a ViewModel
via a
SavedStateHandle
. See which approach may be best for your situation, in this week’s
highlighted Stack Overflow question.
Must We Always Access State Via a Lambda?
Deferring state reads via a lambda expression has long been a technique for performance
tuning. This does not mean that you should use the technique for all state, as we
see in this week’s higlighted Kotlinlang #compose
Slack thread.
Composable Commentary
Posts, videos, and other new information related to Jetpack Compose!
Video: Shadows In Compose
Google’s Adhithya Ramakumar reviews how we can use the new custom shadow APIs in Compose 1.9, including custom colors, animations, neomorphic and neobrutal shadows, and more.
Clipping and Masking in Jetpack Compose
Victor Brandalise compares and contrasts clipping and masking, both in their
visual effect and in terms of their implementation via clip()
and drawWithContent()
modifiers.
Navigate back with results in Jetpack Compose Navigation
Anil Kumar Beesetti demonstrates some custom extension functions for NavController
that provide support for delivering results from a route’s composable back to
the code that triggered the navigation to that route.
Mark your models as stable with the Compose runtime annotation library
Jaewoong Eum
(Mastodon, Bluesky)
reviews how to use compose-runtime-annotation
and the little-used
compileOnly()
Gradle declaration to allow stability
to be declared across modules, as an official replacement for Jaewoong’s own
Compose Stable Marker library.
Medium: Card Corners in Jetpack Compose: Convex, Concave, Cut and Sharp
Pablo Costa demonstrates creating custom Shape
declarations for different
types of corners, then how to bundle them into a cornerShape()
builder to allow
different corners of a Box()
(or anything) to have different shapes.
Saving the Compose for Desktop Window Size
Marco Gomiero, on Mastodon and Bluesky, shows how to monitor the window size in a Compose for Desktop app, with an eye towards persisting it on changes and re-applying the last-seen size when creating the window the next time.
Other Interesting Links
- Medium: 2 Years of Jetpack Compose Animations: What I Wish I Knew Starting Out
- Medium: Building a Perfect Movable FAB with Submenu in Jetpack Compose: A Complete Guide
- Medium: Creating a white-label app with Compose Multiplatform
- Medium: Jetpack Compose Permissions Made Easy: Official API vs Accompanist
- Medium: Loading Resources with Custom Qualifiers at Runtime in Android
- Medium: State Restoration in Deep Navigation Stacks — Keeping Your Compose Apps Stable
- Medium: Understanding Modifier Ordering in Jetpack Compose
- Medium: Why Your Compose Multiplatform Project Will Break Without expect/actual
- Video: Compose Your Way: A Real-World Journey in Android UI Transformation
- Whats new in… ‘AndroidX Text - 1.0.0-alpha01’
Resource Roundup
100% pure code!
GitHub: White-Wind-LLC / table
The White Wind LLC team created a Material3 data table implementation for Compose Multiplatform, supporting Android, iOS, desktop, and Web/JS. It offers drag-and-drop reordering of columns, per-column sorting, filtering, row selection, and much more.
GitHub: FletchMcKee / liquid
Fletch McKee brings another set of effects that resemble Apple’s Liquid Glass,
for Compose for Android, via a pair of modifiers and an associated LiquidState
.
GitHub: deanalvero / swiftycompose
Dean Alvero is working on a library to make it easier for Swift UI developers to write
composables, with a set of composables that mimic Swift UI elements, such as VStack()
and HStack()
.
GitHub: kingsword09 / SymbolCraft
GitHub user kingsword09 has created a Gradle plugin that generates ImageVector
declarations from the Material Design icon library SVG files.
Other Interesting Links
- GitHub: arashiyama11 / ComposeMark (turn Markdown into Compose code)
- GitHub: bnorm / storyboard (presentation framework)
- GitHub: EnesTopal / equal-switch (switch implementation)
- GitHub: irgaly / compose-navigation3-resultstate (result passing for Nav3)
- GitHub: Irineu333 / Nil (image loader)
- GitHub: pandulapeter / kubriko (2D game engine)
- GitHub: RufenKhokhar / K-Spinner (drop-down list)
- GitHub: tarifchakder / MaterializeKMP (Material3 theme system)
Or, you can subscribe to the Atom feed or follow Mark Murphy in the Fediverse.
Recent Issues:
- 2025-09-09: Compose Multiplatform alpha! weight()! Conditional layouts! Shared element keys! And... composables for audio?!?
- 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()?!?