jetc.dev Newsletter Issue #257

Published: 2025-03-18

We got our first RC for the 1.8.0 Compose release!

Beyond that, we look at states, bumps, dialogs, and dropdowns. Plus, we call out some tabs for being lazy.

Ooooo… What Did We Get?

Reviewing the release notes for the latest Jetpack Compose update!

The Compose BOM family were updated to 2025.03.00. However, the production BOM did not change targets — you get 1.7.8, as you did with 2025.02.00.

However, the core Compose artifacts are up to 1.8.0-rc01, as we continue heading towards a 1.8.0 stable release (in time for Google I|O?). If you are using SnapshotObserver, some APIs were renamed. Otherwise, this release just has a few bug fixes.

Compose Material3 is up to 1.4.0-alpha10, with a bunch of API changes. Of note, TabRow() and ScrollableTabRow() are being deprecated, in favor of Primary...() and Secondary...() flavors of each of those.

Wear Compose is up to 1.5.0-alpha11, with several changes. PagerState is now decoupled from Foundation’s PagerState, CurvedModifier now offers semantics, rotary overscroll is offered, and more!

We also got a bunch of related updates, including:

  • androidx.activity:activity-compose:1.11.0-alpha01
  • androidx.lifecycle:lifecycle-runtime-compose:2.9.0-alpha12
  • androidx.lifecycle:lifecycle-runtime-compose-android:2.9.0-alpha12
  • androidx.lifecycle:lifecycle-runtime-compose-jvmstubs:2.9.0-alpha12
  • androidx.lifecycle:lifecycle-runtime-compose-linuxx64stubs:2.9.0-alpha12
  • androidx.lifecycle:lifecycle-viewmodel-compose:2.9.0-alpha12
  • androidx.lifecycle:lifecycle-viewmodel-compose-android:2.9.0-alpha12
  • androidx.lifecycle:lifecycle-viewmodel-compose-desktop:2.9.0-alpha12
  • androidx.media3:media3-ui-compose:1.6.0-rc01
  • androidx.navigation:navigation-compose:2.8.9
  • androidx.navigation:navigation-compose:2.9.0-alpha08
  • androidx.navigation:navigation-compose-android:2.9.0-alpha08
  • androidx.navigation:navigation-compose-jvmstubs:2.9.0-alpha08
  • androidx.navigation:navigation-compose-linuxx64stubs:2.9.0-alpha08
  • androidx.navigation:navigation-fragment-compose:2.8.9
  • androidx.navigation:navigation-fragment-compose:2.9.0-alpha08
  • androidx.savedstate:savedstate-compose:1.3.0-alpha10
  • androidx.savedstate:savedstate-compose-android:1.3.0-alpha10
  • androidx.savedstate:savedstate-compose-jvmstubs:1.3.0-alpha10
  • androidx.savedstate:savedstate-compose-linuxx64stubs:1.3.0-alpha10

One Off the Stack, One Off the Slack

You’ve got questions. That’s understandable!

Why Do I Need to Provide an Initial State?

Spoiler alert: A State needs a state. If you are trying to adapt a flow to a State using collectAsStateWithLifecycle(), it matters whether your flow is a Flow or a StateFlow, in terms of the initial state for your desired State. Learn more in this week’s highlighted Stack Overflow question.

Can I Have a Horizontally-Scrolling FlowRow()?

FlowRow() is designed to wrap as a collection of composables exceeds the available width. But, what if a single composable out of that collection exceeds the available width — could we have the row scroll for that composable? See one possible solution in this week’s highlighted Kotlinlang #compose Slack thread.

Composable Commentary

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

Medium: Bump’s Journey into Delightful Experiences on Android with Jetpack Compose

The amo team has been using Compose for their Bump social mapping app. This post outlines some of their approaches for animations, photography, and maps in a Compose for Android app.

Medium: Jetpack Compose and Nested Scrolling

Karol Ksionek needed to show a collection of LazyVerticalGrid() composables in a LazyColumn(). By default, Compose does not support nested scrollable composbales, but the nestedScroll() modifier can be used to address that issue. This post is also available in video form.

Medium: 5 Simple Do’s and Don’ts: Jetpack Compose Accessibility Guide

Stefan Kramreither walks us through common things to do — or to avoid — when implementing accessibility in your Compose UI app. Suggestions range from setting roles and adding contentDescription to supporting collectionInfo and identifying heading() composables.

Centering top-level dialog windows in Compose Multiplatform

Thomas Künneth (Bluesky) returns, this time exploring dialogs and windows on Compose Multiplatform. On Compose for Desktop, you might use dialogs with dedicated windows in places where on mobile you might use sheets. Thomas shows how to handle those scenarios, plus how to center the dialogs on the underlying app window.

Medium: Enhancing Dropdown Menus in Jetpack Compose: Implementing Searchable Selection

Kerry Bisset shows us how to implement a dropdown menu with a search field to help users find an item within a long menu.

Resource Roundup

100% pure code!

GitHub: cybozu / callout-compose

The cybozu team has implemented an anchoredCallout() modifier and a Callout() composable to render tooltip-style callouts associated with other composables, such as for help or onboarding.

GitHub: VinsonGuo / ComposeLazyTab

Vinson Guo brings us a LazyTabContainer() that implements tabs with lazy-loading of tab contents, via delayed execution of the composable lambdas for those contents.

mejdi hafien has created a search field for Compose Multiplatform.