jetc.dev Newsletter Issue #205
Published: 2024-03-05
JetBrains released Compose Multiplatform 1.6.0, so we celebrate! 🎉
We also hear from Googlers regarding shape morphing and strong skipping. We implement sticky headers in lazy grids for a calendar, and we accept GIFs in our text fields. Plus we look at a Compose Multiplatform table implementation and a player composable for YouTube videos.
NOTE: I am taking a one-week break from the newsletter. The next issue will be out in two weeks, on March 19th.
Ooooo… What Did We Get?
Reviewing the release notes for the latest Jetpack Compose update!
Compose Multiplatform 1.6.0 is final!
We now have a stable release with the resources API, UI testing, @Preview
support
in the Fleet IDE, and more.
One Off the Stack, One Off the Slack
You’ve got questions. That’s understandable!
How Do We Detect If the User Is Scrolling?
Sometimes, we want our UI to be subtly different while the user is scrolling (e.g., a lazy list)
and when the user has stopped scrolling. We can explicitly declare a LazyListState
for the list to use and observe changes in isScrollInProgress
for this, as we see
in this week’s highlighted Stack Overflow question.
How Can We Expire State?
Sometimes, we have state that gets stale, simply due to the passage of time. We explore
options for implementing this efficiently, without busy loops or the like, in this
week’s highlighted Kotlinlang #compose
Slack thread.
Composable Commentary
Posts, videos, and other new information related to Jetpack Compose!
Medium: Fun with shapes in Compose
Google’s Rebecca Franks not only points us to
new documentation on the Compose UI graphics-shapes
library
but explores how to use it. Rebecca demonstrates RoundedPolygon
for polygonal
shapes, Morph
to represent a transition between two shapes, and a variety
of fancy Path
tricks!
Medium: Jetpack Compose: Strong Skipping Mode Explained
Google’s Ben Trengrove dives into “strong skipping” mode, an experimental feature in Compose 1.5.x and 1.6.x and the default behavior in 1.7.0 alphas. Strong skipping mode allows many more recompositions to be skipped than does the default behavior. This greatly increases performance, but it comes at the cost of potentially introducing some bugs in your code.
Medium: Creating a Sticky Months Calendar UI with Jetpack Compose
Sibel Nalop wanted a vertically-scrolling montly calendar where not only were the days of the week pinned at the top, but the name of the top-most month would be sticky as the user scrolls up and down. This is rather complex, as “sticky” behavior is not included in the lazy containers, so Sibel supplies an implementation.
Rich media input from the keyboard in Compose
Soft keyboards that support GIFs, animated emojis, stickers, and the like require
app support to consume that rich content. Historically, that was limited to the View
system, but the 1.7.0 alphas have added a receiveContent()
modifier that we can apply
to BasicTextField2()
. Shreyas Patil explores how this works, including how you
get a Uri
to the rich content media.
Medium: Firing Side Effects from Compose using SnapshotFlow
Efe Ejemudaro describes a situation where state changes do not drive UI changes, but rather
trigger side effects such as logging or analytics. Efe compares and contrasts derivedStateOf()
and snapshotFlow()
as ways of observing the state changes, with snapshotFlow()
causing
fewer pointless recompositions.
Medium: Tiamat - simple Compose Multiplatform navigation
Yahor Urbanovich describes Tiamat, his team’s implementation of a navigation system for Compose Multiplatform. Tiamat supports object-based navigation (vs. strings), has its own multiplatform viewmodel, supports nested navigation, and more.
Medium: State Management in Jetpack Compose: ViewModel vs. Remember Function
Kerry Bisset uses the case of tracking a list’s scroll position, comparing and contrasting
holding that in a composable via remember()
or holding it in a ViewModel
. Both
have their places, and Kerry examines what a hybrid approach might look like.
Medium: Overcoming Common Performance Pitfalls in Jetpack Compose
Pushpal Roy explores performance issues in Compose and how to address them. While
strong skipping may alleviate some of the concerns over unstable parameters
and needing to remember()
lambdas, it is useful to understand why these concerns
exist in the first place.
Jetpack Compose Tips and Conventions for the @Composables to Make Them Better
Tomáš RepÄŤĂk outlines a series of general recommendations for composables, based on the official recommendations.
Other Interesting Links
- Medium: A Guide to DisposableEffect in Compose
- Medium: Crafting a Reusable Navigation Top Bar in Jetpack Compose
- Medium: Create a Flexible and Customizable Calendar View in Android with Jetpack Compose
- Medium: Create Gemini loading animation using Jetpack compose
- Medium: Decoding Side Effects: A Journey Through LaunchedEffect In Jetpack Compose
- Medium: Diving Into Jetpack Compose to Building Android UIs with a Smile
- Medium: Hilt and Room Database In Jetpack Compose
- Medium: How we switched from XML to Jetpack Compose at SĂĽddeutsche Zeitung
- Medium: Persistent Data Storage Using DataStore (Preferences) in Jetpack Compose
- Medium: Rendering Comparison in Android: The Good, The Bad, and The Ugly — Jetpack Compose, Flutter, and View System: Chapter 3
- Medium: Theme switching in Android Jetpack Compose
- Medium: Think Once, Reuse Forever: Leveraging Generic Jetpack Composables to Eliminate Duplicate Code
- Medium: Understanding Launched Effect in Android Kotlin Jetpack Compose
- Medium: Understanding Window Insets in Jetpack Compose
- Medium: Unlocking Performance: Understanding Strong Skipping in Jetpack Compose
- Video: A chat with Chet Haase & Sergio Sancho: Unveiling Android Shape Morphing Magic
Resource Roundup
100% pure code!
GitHub: windedge / compose-table
GitHub user windedge brings us DataTable()
and PaginatedDataTable()
composables
for Compose Multiplatform, supporting Material and Material3. It covers many of the
CMP platforms: Android, desktop, iOS, and Web/WASM.
GitHub: dautovicharis / Charts
Haris Dautović released a library of charting Material3 composables. The library includes pie charts, bar/stacked-bar charts, and line/multiline charts.
GitHub: IlyaPavlovskii / YouTubePlayer
Ilia Pavlovskii gives us a YouTubePlayer()
composable that embeds a YouTube
video player in your app, with a variety of configuration options and commands to
control video playback.
Notable Releases
MaterialKolor, a library for generating Material3 color palettes, is up to
1.4.2
, supporting Compose Multiplatform 1.6.0, including Compose for Web/WASM.
Or, you can subscribe to the Atom feed or follow Mark Murphy in the Fediverse.
Recent Issues:
- 2024-12-10: A Compose Multiplatform alpha! Hot reload! Presentation! Sprites! Calendars!
- 2024-12-03: Rebecca Franks on clipping and masking! Stefano Natali on graphicsLayer()! FunkyMuse on type-safe nav results! And... if we have enough maps, do we need to store our maps in a Map?!?
- 2024-11-26: Math! Shared element transitions! Custom modifiers! Macrobenchmark! Adapting to platform-specific design systems! And... why does wrapContentSize() not wrap my content size?!?