jetc.dev Newsletter Issue #242

Published: 2024-11-26

This week, we render some math and ponder wrapContentSize() behavior. We look at options for custom modifiers and how to measure composable performance with macrobenchmark. And we adapt our composables to platform-specific design systems… if that is what our designers want, anyway.

One Off the Stack, One Off the Slack

You’ve got questions. That’s understandable!

How Can I Render Math Formulas in Compose?

Personally, my gut instinct for this is to turn to a library, such as CExpr. But, for lightweight use, rendering a mathematical expression is not hard to do on your own, as we see in this week’s highlighted Stack Overflow question.

Why Does wrapContentSize() Not Wrap My Content Size?

This can happen for text, as wrapContentSize() does not attempt to take word wrap fully into account. While there is an open issue on this, it may not be avoidable in the general case. For specifically text, this workaround might help. Learn more in this week’s highlighted Kotlinlang #compose Slack thread.

Composable Commentary

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

Video: Animating Your World

Google’s Doris Liu joined the Code with the Italians team to talk about Compose animations, focusing on shared element transitions and Navigation for Compose.

Medium: Custom modifiers in Jetpack Compose

Siddharth Gupta walks us through the three main ways to build custom modifiers: composed(), a @Composable function that serves as a modifier “factory”, and the newer Modifier.Node API. The latter is more complicated but is also more performant.

Benchmark Insights: Direct State Propagation vs. Lambda-based State in Jetpack Compose

Shreyas Patil (Mastodon, Bluesky) got some pushback for an earlier post on skipping intermediate composables. So, this time around, the focus is on how the benchmarking was done to help drive the conclusions from that earlier post, emphasizing the use of macrobenchmark.

Video: Authenticated Navigation in Jetpack Compose

Paul Jones delivered a presentation for GDG Wellington, examining how to have certain routes in Navigation for Compose require authentication, including handling deeplinks that are tied to those routes.

Centering in Compose

Zach Klippenstein (Bluesky) is pivoting towards the center. Or, at least, he is trying to help you get your composables centered. While using Box() with a Center contentAlignment works, Zach dives more into why that works and alternative solutions, such as by using the layout() modifier.

Google Maps in Jetpack Compose: Polylines

Joe Birch (Mastodon) continues his tour of Maps for Compose, this time examining how to draw straight lines between points on the map, including configuring the line rendering (color, width, dashed, etc.).

Medium: Widgets With Glance: Beyond String States

Katie Barnett continues her series of posts on Glance, this time looking at GlanceStateDefinition and building a custom implementation, rather than relying solely on a string-centric, out-of-the-box PreferencesGlanceStateDefinition solution.

Resource Roundup

100% pure code!

GitHub: shubhamsinghshubham777 / Adapt

Shubham Singh is building up libraries that implement Apple and Microsoft design systems (used on iOS/macOS and Windows, respectively). Adapt also has “platform agnostic” widgets that use the platform’s specific design system based on the platform the code runs on (e.g., Material 3 for Android/Web).

Compose Libraries

Alex Styl (Bluesky) is assembling a catalog of Compose libraries, including ones for Compose Multiplatform.

Notable Releases

Appyx is up to 1.5.1, adding global plugins and updating libraries.

Redwood has a 0.16.0 release, fixing a handful of bugs and completing some announced code removals.