jetc.dev Newsletter Issue #261

Published: 2025-04-15

Once again, we have new Compose BOMs, a new Compose RC, and a new Compose Multiplatform beta, so let’s take a look!

In addition, we ponder the utility of SideEffect() and screenshot tests. We put our camera on a tabletop, play YouTube videos, and take some notes in our own handwriting. We also see another Compose Multiplatform set of media player wrappers and an image cropping library.

Ooooo… What Did We Get?

Reviewing the release notes for the latest Jetpack Compose update!

The Compose BOMs are up to 2025.04.00. The production BOM still points to 1.7.8 of the major Compose artifacts.

Those same artifacts now have a 1.8.0-rc03 release, as we creep ever closer to a stable 1.8.0 release. This RC seems to have consisted of a single commit for a bug fix.

Compose Material3 had a 1.3.2 release for some bug fixes. It also got a 1.4.0-alpha12 release with new NavigationSuite... types and composables, along with bug fixes.

Wear Compose is up to 1.5.0-alpha13, mostly with bug fixes.

The following Compose-adjacent artifacts got updates:

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

And JetBrains released 1.8.0-beta02 for Compose Multiplatform. This adds some iOS improvements to BasicTextField() and a lot of bug fixes.

One Off the Stack, One Off the Slack

You’ve got questions. That’s understandable!

Why Do We Need SideEffect()?

Most of the other effect handlers have fairly visible roles, but SideEffect() sometimes brings a 🤷‍♂️ reaction. Learn more about the purpose and use of this effect in this week’s highlighted Stack Overflow question.

Are Screenshot Tests Worth It?

Some love ‘em, some are less than impressed. See arguments for both sides, thoughts on performance and drift, and more in this week’s highlighted Kotlinlang #compose Slack thread.

Composable Commentary

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

Medium: Adaptive Camera: Smooth Tabletop Mode with Animations

Google’s Jolanda Verhoef (Mastodon, Bluesky) concludes her series on building a camera app using Compose for Android and CameraX. This post focuses on foldables and being able to transition between postures, particularly tabletop mode.

Medium: Understanding the Internals of Side-Effect Handlers in Jetpack Compose

Jaewoong Eum (Mastodon, Bluesky) dives into effect handlers — LaunchedEffect(), DisposableEffect(), and SideEffect() — looking at both the use cases for each and their respective implementations.

Medium: Compose Meets YouTube: Production-Ready YouTube Playback with Jetpack Compose

YouTubers will be pleased that Anatolii Frolov has taken the time to show Compose for Android developers how to wrap YouTubePlayerView in an AndroidView()!

Medium: Scaffold for Jetpack Compose Desktop

Scaffold() can work in a desktop app, but it is not ideal. Kerry Bisset shows off a DesktopApplicationScaffold() and a DesktopAreaScaffold() to provide the same sort of pattern with desktop-friendly sizing and related rules.

Medium: Enhancing Note-Taking with Jetpack Compose

Medium user henni99 is the developer of WriteBuddy, which offers a set of composables for handwriting input, supporting Compose Multiplatform.

Medium: Building ProShape: A Tiny UI Library for Better Corners in Compose Multiplatform

Riad Mahi likes squircles, but found RoundedCornerShape to be too inflexible. The result is ProShape, a Compose Multiplatform library for offering rounded corners only for the corners that you need.

Medium: Compose Multiplatform: A Practically-Native Example!

Jonathan Davis walks us through how to blend Compose Multiplatform (for basic UI elements) with per-platform native widgets (for things like maps) into a seamless experience.

Medium: Maps in Jetpack Compose — A beginner’s guide

Speaking of maps, Anitaa Murthy provides an extensive writeup of how to add Maps for Compose to your Compose for Android project, including adding markers and polylines.

Taking a Look at Storytale

Kevin Schildhorn (Bluesky) explores Storytale, a Gradle plugin for generating interactive component previews based on “stories”.

Resource Roundup

100% pure code!

GitHub: open-ani / mediamp

GitHub user open-ani is building a set of Compose Multiplatform wrappers for media players. Android wraps ExoPlayer, desktop wraps VLC, and iOS wraps AVKit. The goal is a single API usable cross-platform.

GitHub: Tanish-Ranjan / crop-kit

Tanish Ranjan created an ImageCropper() composable to let you crop images, with configurable options for crop shape, image flip and rotation, and gridlines.

GitHub: austin17ng / Austin_SegmentedControl

Austin Nguyen published a SegmentedControl() composable, to bring an iOS-style segmented control to Android.

Notable Releases

Appyx is up to 1.7.0, updating some dependencies.

Molecule shipped 2.1.0 gives you more control over snapshot notifications.

And Mosaic’s 0.17.0 release has migrated to its own terminal integration/parsing code, setting the stage for many more new capabilities.