Archive
Everything published here, newest year first.
101 posts
2026 98
- 100 days of Compose: the eight ideas the other ninety-nine posts kept circling 100 Days of Compose · Day 100
- Glance looks like Compose and compiles to RemoteViews, which explains every limitation 100 Days of Compose · Day 99
- Notifications are the one UI you can't build in Compose 100 Days of Compose · Day 98
- Predictive back turns a commitment into a preview, and your BackHandler can break it 100 Days of Compose · Day 97
- There are three kinds of inset, and using the wrong one is why your keyboard fights your layout 100 Days of Compose · Day 96
- Edge-to-edge stopped being a choice, and most apps found out from a bug report 100 Days of Compose · Day 95
- The checks that run without you asking are the ones that scale 100 Days of Compose · Day 94
- The Layout Inspector shows you a tree you didn't write 100 Days of Compose · Day 93
- A preview that needs a ViewModel is telling you something 100 Days of Compose · Day 92
- Two navigation systems can share one back stack, which is the only reason this works 100 Days of Compose · Day 91
- Porting a RecyclerView deletes four classes and keeps one idea 100 Days of Compose · Day 90
- AndroidView has two lambdas, and putting work in the wrong one is the bug 100 Days of Compose · Day 89
- ComposeView is easy; deciding where to put it is the migration 100 Days of Compose · Day 88
- What a Compose test suite should actually contain 100 Days of Compose · Day 87
- A flaky test is a timing assumption you didn't know you made 100 Days of Compose · Day 86
- Find, act, assert — and the rule that decides which test to write at all 100 Days of Compose · Day 85
- Your UI tests query the accessibility tree, which is why testTag is a last resort 100 Days of Compose · Day 84
- Four tools, four questions, and none of them answers another's 100 Days of Compose · Day 83
- Nine pillars have quietly been teaching you one optimisation 100 Days of Compose · Day 82
- Baseline Profiles fix a problem recomposition counts can't see 100 Days of Compose · Day 81
- Strong skipping made most of yesterday's advice unnecessary 100 Days of Compose · Day 80
- The compiler decides your types are unstable, and it writes down why 100 Days of Compose · Day 79
- Compose performance is one question asked in four places 100 Days of Compose · Day 78
- Drag-and-drop crosses app boundaries, which is why it isn't just a drag gesture 100 Days of Compose · Day 77
- Focus is the input model you don't test until someone plugs in a keyboard 100 Days of Compose · Day 76
- Nested scroll is a negotiation, and there are four moments to intervene 100 Days of Compose · Day 75
- Pinch, pan and rotate arrive together, and the centroid is what ties them 100 Days of Compose · Day 74
- Swipe-to-dismiss is a state machine with anchors, not a drag handler 100 Days of Compose · Day 73
- clickable does six things, and detectTapGestures does one 100 Days of Compose · Day 72
- Every gesture in Compose is a coroutine reading a stream of events 100 Days of Compose · Day 71
- Automated checks find the missing labels. They can't tell you the label is wrong. 100 Days of Compose · Day 70
- Reading order is layout order, until your layout stops matching your meaning 100 Days of Compose · Day 69
- One card, four announcements — merging is the fix 100 Days of Compose · Day 68
- Compose builds a second tree, and it's the one your users hear 100 Days of Compose · Day 67
- Take the clock away and animations become testable 100 Days of Compose · Day 66
- A shared element transition is one element pretending to be two 100 Days of Compose · Day 65
- You cannot fade out something that has already left the composition 100 Days of Compose · Day 64
- updateTransition is a state machine that happens to animate 100 Days of Compose · Day 63
- You don't animate from A to B, you declare B and Compose handles the rest 100 Days of Compose · Day 62
- Compose has a dozen animation APIs and one decision tree 100 Days of Compose · Day 61
- Four bytes a pixel is the number that decides whether your app gets killed 100 Days of Compose · Day 60
- A shadow needs a shape, and Compose won't guess one for you 100 Days of Compose · Day 59
- Your gradient is measured in pixels, and that's the bug 100 Days of Compose · Day 58
- A Painter is the thing that knows how big it wants to be 100 Days of Compose · Day 57
- A vector costs CPU once, a bitmap costs memory forever 100 Days of Compose · Day 56
- contentScale and Modifier.size are answering different questions 100 Days of Compose · Day 55
- Two lines of autofill are worth more than a week of form polish 100 Days of Compose · Day 54
- Your custom font has a fallback, and you didn't choose it 100 Days of Compose · Day 53
- TextFieldState is a document, and edits are transactions on it 100 Days of Compose · Day 52
- Your list rows are different heights because text measurement is honest 100 Days of Compose · Day 51
- AnnotatedString is why you don't need three Text composables in a Row 100 Days of Compose · Day 50
- Compose is growing a styles API, and it's for the gap theming never covered 100 Days of Compose · Day 49
- Extending MaterialTheme beats replacing it, until it doesn't 100 Days of Compose · Day 48
- Corner radius is a signal, and Material has five of them 100 Days of Compose · Day 47
- Fifteen named text styles are fewer decisions than five 100 Days of Compose · Day 46
- Dynamic colour takes your brand palette away, and that's the deal 100 Days of Compose · Day 45
- MaterialTheme is three CompositionLocals and nothing else 100 Days of Compose · Day 44
- SearchBar has two states, and the second one takes over the screen 100 Days of Compose · Day 43
- Date pickers are a timezone bug with a calendar attached 100 Days of Compose · Day 42
- The spinner you show for 200ms is worse than no spinner 100 Days of Compose · Day 41
- Bar, rail, drawer — the same destinations, chosen by window width 100 Days of Compose · Day 40
- A dialog is state, not a function you call 100 Days of Compose · Day 39
- The TextField overload you're using is probably the deprecated one 100 Days of Compose · Day 38
- Checkbox, radio, switch: three controls, three different questions 100 Days of Compose · Day 37
- Five buttons, one hierarchy, and the rule that decides which 100 Days of Compose · Day 36
- The Scaffold parameter everyone ignores is the one that breaks the layout 100 Days of Compose · Day 35
- An external display is a second window, not a bigger one 100 Days of Compose · Day 34
- A hinge is a physical object, and your layout should know where it is 100 Days of Compose · Day 33
- SupportingPaneScaffold is for content that is about other content 100 Days of Compose · Day 32
- ListDetailPaneScaffold: the back button is the whole reason it exists 100 Days of Compose · Day 31
- There are three adaptive layouts, and you probably don't need a fourth 100 Days of Compose · Day 30
- Screen size is the wrong thing to branch on. Window size is the right one. 100 Days of Compose · Day 29
- Porting FlexboxLayout: every flex property maps onto something, but not onto one thing 100 Days of Compose · Day 28
- Sometimes the right grid is a Column of Rows 100 Days of Compose · Day 27
- FlowRow is the chip group you kept writing a custom Layout for 100 Days of Compose · Day 26
- HorizontalPager is a lazy list that snaps — and PagerState is where the bugs live 100 Days of Compose · Day 25
- A grid is not a list with two columns 100 Days of Compose · Day 24
- LazyColumn is not a faster Column, and items(key = …) is not optional 100 Days of Compose · Day 23
- Write a custom modifier only after you've ruled out a function 100 Days of Compose · Day 22
- Why fillMaxWidth() sometimes does nothing 100 Days of Compose · Day 21
- padding().background() and background().padding() are not the same picture 100 Days of Compose · Day 20
- A Modifier is a linked list, and that explains almost everything about it 100 Days of Compose · Day 19
- Column, Row, Box — and the single-pass rule that makes them fast 100 Days of Compose · Day 18
- Not every state holder is a ViewModel 100 Days of Compose · Day 17
- The UI layer has two halves, and merging them is why screens become untestable 100 Days of Compose · Day 16
- CompositionLocal is not dependency injection, and using it that way hurts later 100 Days of Compose · Day 15
- rememberSaveable survives what remember doesn't — and it isn't a bigger remember 100 Days of Compose · Day 14
- Six parameters deep and none of them are used here 100 Days of Compose · Day 13
- The ViewModel is not the default place for state. It's the place for state that outlives the screen. 100 Days of Compose · Day 12
- State hoisting is one question: who else needs to know? 100 Days of Compose · Day 11
- Composition, layout, drawing — and why reading a value in the wrong one costs frames 100 Days of Compose · Day 10
- Your composable ran four times. So did your network call. 100 Days of Compose · Day 9
- A composable's lifecycle is three events, and none of them is onDestroy 100 Days of Compose · Day 8
- Recomposition doesn't re-run your screen. It re-runs the scopes that read what changed. 100 Days of Compose · Day 7
- What @Composable actually does to your function 100 Days of Compose · Day 6
- Thinking in Compose: you can't reach into the UI any more, and that's the point 100 Days of Compose · Day 5
- Compose has two version problems, and the BOM only solves one 100 Days of Compose · Day 4
- adb install -r doesn't kill your app, so your screenshot is a lie
2024 3
- Basics of Jetpack Compose 100 Days of Compose · Day 3
- What is Jetpack Compose? 100 Days of Compose · Day 2
- Analyse your Android knowledge before you learn anything new 100 Days of Compose · Day 1