kotlinx.serialization is compile-time, which is why your polymorphism fails at runtime
No reflection on Native, so the serializer is generated. Sealed hierarchies work; open polymorphism needs a module you register by hand.
We use Google Analytics to see which pages help people. No ads, no profiles. Privacy Policy
No reflection on Native, so the serializer is generated. Sealed hierarchies work; open polymorphism needs a module you register by hand.
Swift cancels its Task. The Kotlin Job never hears about it, so the work keeps running.
A consumable with no recorded lifetime is indistinguishable from a service that is down.
Dispatchers.Default is a single thread in the browser. Code that was merely slow on Android becomes a frozen tab.
Material's shape scale gives five corner sizes mapped to component categories. The system is simple; the interesting parts are clip ordering, asymmetric corners, and shapes that must respond to state.
Material's type scale gives fifteen named roles instead of a font-size parameter. Naming the role rather than the size is what makes typography consistent across a team and correct at large font scales.
Dynamic colour derives a full Material scheme from the user's wallpaper. It improves the feel of most apps and destroys brand recognition if applied indiscriminately, so the interesting work is deciding what stays fixed.
MaterialTheme provides three CompositionLocals and a handful of defaults. Understanding its actual shape explains how components pick up styling, why hardcoded values break dark mode, and what a custom theme has to replace.
Material 3's SearchBar transitions into a full-screen suggestion surface, which makes it a navigation concern. Chips come in four semantic variants, and the assist/filter/input/suggestion split matters.
Compose's date and time pickers are straightforward components hiding a genuine trap: the selected value is UTC-midnight epoch millis, and converting it naively shifts dates by one in most of the world.
Compose gives you progress indicators; it doesn't tell you when to show one. Duration decides: under 300ms show nothing, over a second show progress, and never let an indicator replace content that could be a skeleton.
A budget expressed as a value can be read, derived from and audited. Buried in a conditional it can only be obeyed or removed, and it gets removed.