jetc.dev Newsletter Issue #263

Published: 2025-04-29

Bang the drum! đŸ„ Compose for Android 1.8.0 shipped in stable form! Just in time for next month’s Google I|O! What a coincidence! 😉

This week, we see what made the final cut for 1.8.0 and what the next alpha looks like. We look at tooltips and ticket shapes. And we see a rather feature-filled data table implementation.

Ooooo
 What Did We Get?

Reviewing the release notes for the latest Jetpack Compose update!

The Compose BOMs are up to 2025.04.01. And the production BOM contains the 1.8.0 final artifacts! 🎉

And, as usual, a production release means we got our first alpha for the next release, 1.9.0-alpha01. Of note:

  • @Stable, @Immutable, and @StableMarker are now in a runtime-annotation library, so we can use them in modules that otherwise do not need Compose (e.g., model definitions)

  • @FrequentlyChangingValue lets us denote things that should not be called directly in a composition, for performance reasons

  • @RememberInComposition says “hey, you need to remember() this”

  • AnnotatedString has a new API for custom bullet lists

  • clickable(), combinedClickable(), selectable(), toggleable(), and triStateToggleable() require the use of an IndicationNodeFactory in LocalIndication, if you are not passing in an Indication parameter

  • A keepScreenOn() modifier was added

There were many other changes introduced in this alpha, so 1.9.0 is shaping up to be a rather large release.

Wear Compose is up to 1.5.0-alpha14, migrating a bunch of stuff from foundation to material.

And, in Compose-related libraries, we got the following updates:

  • androidx.activity:activity-compose:1.11.0-rc01
  • androidx.lifecycle:lifecycle-runtime-compose:2.9.0-rc01
  • androidx.lifecycle:lifecycle-runtime-compose-android:2.9.0-rc01
  • androidx.lifecycle:lifecycle-runtime-compose-jvmstubs:2.9.0-rc01
  • androidx.lifecycle:lifecycle-runtime-compose-linuxx64stubs:2.9.0-rc01
  • androidx.lifecycle:lifecycle-viewmodel-compose:2.9.0-rc01
  • androidx.lifecycle:lifecycle-viewmodel-compose-android:2.9.0-rc01
  • androidx.lifecycle:lifecycle-viewmodel-compose-jvmstubs:2.9.0-rc01
  • androidx.lifecycle:lifecycle-viewmodel-compose-linuxx64stubs:2.9.0-rc01
  • androidx.navigation:navigation-common-linuxx64stubs:2.9.0-rc01
  • androidx.navigation:navigation-compose:2.9.0-rc01
  • androidx.navigation:navigation-compose-android:2.9.0-rc01
  • androidx.navigation:navigation-compose-jvmstubs:2.9.0-rc01
  • androidx.navigation:navigation-compose-linuxx64stubs:2.9.0-rc01
  • androidx.navigation:navigation-fragment-compose:2.9.0-rc01
  • androidx.savedstate:savedstate-compose:1.3.0-rc01
  • androidx.savedstate:savedstate-compose-android:1.3.0-rc01
  • androidx.savedstate:savedstate-compose-jvmstubs:1.3.0-rc01
  • androidx.savedstate:savedstate-compose-linuxx64stubs:1.3.0-rc01

Plus, JetBrains released 1.8.0-rc01 of Compose Multiplatform, inching us close to a matching production release to Compose for Android.

One Off the Stack, One Off the Slack

You’ve got questions. That’s understandable!

Where Did My Nav Graph Go?

rememberNavController() is easy
 perhaps too easy. With Navigation for Compose you need to be careful about when and where you create your NavController instances, as we see in this week’s highlighted Stack Overflow question.

How Can I Write This Modifier Using Nodes?

There are (at least) three ways to write modifiers that are themselves composable: @Composable functions, the composed() factory, and Modifier.Node. The latter is the most performant, but it is rather verbose compared to the others, as we see in this week’s highlighted Kotlinlang #compose Slack thread.

Composable Commentary

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

What’s new in the Jetpack Compose April ’25 release

Google’s Jolanda Verhoef (Mastodon, Bluesky) reviews the contents of Compose for Android 1.8.0, including the long-awaited support for autoSize in BasicText(), better autofill support, the new animateBounds() modifier, and more.

Medium: Tooltips in Compose Material 3

Domen LaniĆĄnik walks us through plain and rich tooltips in Compose Material3, powered by the TooltipBox() composable. Domen also reviews what changed in the 1.4.0 alpha releases that impact tooltips.

Medium: Technical Deep Dive: Custom Path Drawing for Ticket Shapes in Jetpack Compose

Paper tickets — the classic kind that you tear off of a roll — have a deceptively complex shape, with rounded corners and semi-circular notches on the ends. Abdul Mughni leveraged BĂ©zier curves to create a Shape implementation for tickets and shows us how to make it work.

Medium: Understanding the Box Model in Jetpack Compose: Where’s My Modifier.margin?

A common question for newcomers to Compose from classic Views is “where do I define a margin?”. Sumeet Panchal takes us through the box model employed by Compose and explains how one accomplishes the sorts of designs that used to use the various margin attributes in layout XML.

Resource Roundup

100% pure code!

GitHub: ryinex / compose-table

GitHub user ryinex brings us a DataTable() composable offering a two-dimensional scrolling grid, with resizable columns, sticky headers, in-cell editing, custom cell rendering, and more! Better still, this Compose Multiplatform table supports Android, iOS, desktop, and Web.

GitHub: isakaro / kwik-ui-android

GitHub user isakaro is building out a massive library of composables, from accordions and filter chips to rating bars and timelines.

GitHub: shprotx / Custom_Sliders

Arturka Arturka brings us a few slider composables, including a color picker and a two-value slider.

Notable Releases

Maps for Compose is up to 6.6.0, adding an attribution ID.

Compose Unstyled is out with 1.28.0, adding a Button() component. This follows a blizzard of point releases that added progress indicator, radio group, toggle switch, and text components.