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.

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.

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.