jetc.dev Newsletter Issue #269

Published: 2025-06-17

This week, we examine Compose Multiplatform and server-defined UI. We peek at OpenGL and signatures in Compose Multiplatform projects. And, we continue our quest for greater focus.

One Off the Stack, One Off the Slack

You’ve got questions. That’s understandable!

Why Is My UI Not Updating This Time?

In many cases, if you are mutating state and the UI is not responding, there is an issue in how you are mutating the state. In this case, the culprit is a MutableList. Changing the content of a MutableList, then re-emitting that MutableList via send() on a ChannelFlow will not work, as while the list content has changed, the list identity has not, and that is all ChannelFlow cares about. Learn more in this week’s highlighted Stack Overflow question.

How Can I Control the Initial Focus?

Focus management is a pain, and Compose does not change that much. One facet of focus is controlling what focusable widget gets the focus when the screen (or tab or whatever) is first displayed. Learn more about onEnter in this week’s highlighted Kotlinlang #compose Slack thread.

Composable Commentary

Posts, videos, and other new information related to Jetpack Compose!

Video: Compose Preview

Google’s Paris Hsu walks us through the use of the @Preview annotation, from simple previews to highly-customized annoations and Android Studio tooling tips.

Medium: Bridging Compose Multiplatform with SwiftUI

Lucas Prioste takes a look at how to blend SwiftUI code on iOS into a mostly-Compose Multiplatform app, for cases where a pure-native iOS widget offers features or functionality that cannot presently be met with Compose Multiplatform.

Video: Multiplatform to the City

Karan Sharma (Mastodon) delivered a presentation for GDG Brisbane on the use of Compose Multiplatform to support both iOS and Android, in the context of a public transportation app.

Handling Privacy Sensitive content in Jetpack Compose

SwiftUI offers a privacySensitive() modifier, so Nishant Srivastava set out to create a Compose equivalent. Specifically, this modifier detects when the window focus moves to some other window and then hides any content rendered by the composable to which the modifier is applied.

Server-driven UI SDK on Android: how RevenueCat enables remote paywalls without app updates

Jaewoong Eum (Mastodon, Bluesky) examines RevenueCat’s implementation of server-defined UI (SDUI) for their Paywall component, showing how a JSON-defined structure can be converted into composables at runtime.

Resource Roundup

100% pure code!

GitHub: karmakrafts / ComposeGL

GitHub user karmakrafts published an OpenGL GLCanvas() composable for Compose Multiplatform, supporting Android, iOS, macOS, Windows, Linux, and the Web. This presently supports GLES 2.0, with a plan to support the richer GLES 3.x in the future.

GitHub: YuukiYoshida / undoable-compose

GitHub user YuukiYoshida brings us a framework for tracking undo/redo operations for TextField() for Compose for Android.

GitHub: niyajali / compose-signature

Sk Niyaj Ali created a Compose Multiplatform library (Android, iOS, desktop, Web/JS, Web/Wasm) for collecting signatures from users, with undo/redo, an optional full-screen mode, customizable theme, and much more!

GitHub: tonykolomeytsev / figx

Anton Kolomeytsev offers a command-line tool that, among other things, exports SVGs from Figma and converts them into ImageVector definitions.

Notable Releases

Circuit is up to 0.28.1, updating dependencies and fixing some bugs.

Compose Unstyled now has a 1.32.0 release, updating dependencies and upgrading the TextField() API options.

Vortex, a fork of Voyager, released 0.2.5 for dependency updates.