Posts on Medium Simon Bogutzky Jan 14, 2026

Building the Same App in SwiftUI, Kotlin Multiplatform, and Flutter — What 281 vs. 75 Lines of Code Teaches Us

Article Summary

Dr. Simon Bogutzky built the same bill-splitting app three times. The line count difference? 75 vs. 281.

This isn't another framework comparison with benchmarks and feature lists. It's a hands-on experiment implementing identical functionality in SwiftUI, Kotlin Multiplatform with Compose, and Flutter to reveal what those code differences actually mean for your team.

Key Takeaways

Critical Insight

SwiftUI wins on elegance for iOS-only apps, KMP/Compose invests in scalable architecture for cross-platform, and Flutter balances pragmatic speed with mature tooling.

The article reveals how each framework's approach to currency localization exposes its entire platform philosophy.

About This Article

Problem

Dr. Simon Bogutzky wanted to understand why state management works so differently across frameworks. SwiftUI's @State property wrappers handle reactivity automatically. KMP/Compose requires explicit derivedStateOf with manual dependency tracking. Flutter demands manual TextEditingController lifecycle management with dispose() cleanup.

Solution

He looked at how each framework approaches state. SwiftUI uses implicit two-way bindings with $ syntax. KMP/Compose provides fine-grained control through remember and mutableStateOf with explicit dependencies. Flutter relies on imperative setState() calls paired with controller disposal in lifecycle methods.

Impact

The comparison showed some real differences. SwiftUI's automatic dependency tracking prevents memory leaks without developer intervention. KMP/Compose's explicit dependencies enable optimization for expensive computations in complex apps. Flutter's manual approach gives developers control but introduces leak risks if they forget dispose() calls.