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”.
Other Interesting Links
- Android Manifest file checklist
- Custom Animations and Transitions in Jetpack Compose
- Medium: 6 steps to make a “Slide to unlock” button in Jetpack Compose
- Medium: How I Set Up a Production-Ready KMP Project with Compose Multiplatform (2025 Guide)
- Medium: Icon Picker — Jetpack Compose Way
- Medium: Jetpack Compose Trick: Progress Bar That Reveals Text with Dynamic Color Blend
- Medium: Managing Text Overflow in Jetpack Compose Buttons
- Medium: Single State Fields VS. State Data Class In ViewModel
- Medium: State in Jetpack Compose Made Simple: ViewModel, Hoisting, and Real-World Patterns
- Medium: Tenant-Specific Theming with Material 3 in Jetpack Compose
- Medium: Useful Custom Modifiers in Jetpack Compose You Might Love
- Slides: Compose Hot Reload 🔥 is here, stop relaunching your app!
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.
Other Interesting Links
- GitHub: buszi / Boomerang (nav result handler)
- GitHub: KishanViramgama / Otp (one-time password UI)
- GitHub: reyazoct / Kmm-Permissions (multiplatform location permissions)
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.
Or, you can subscribe to the Atom feed or follow Mark Murphy in the Fediverse.
Recent Issues:
- 2025-04-08: Wrapping! Wrapping! More wrapping! Optimizing composables! Optimizing Hot Reload! JSON Forms! LiveKit!
- 2025-04-01: Compose RC! Media3! animateBounds()! Custom modifiers using Modifier.Node! Rich text editing! And... is this UI useless?!?
- 2025-03-25: Compose Multiplatform beta! Accessibility! Hot reload! BringIntoViewSpec! And... does this hash seem blurry?!?