All right, let's talk about Flutter.
The Flutter team has successfully bootstrapped material_ui and cupertino_ui, and we have a lovely tracker project on GitHub.
Finally! This is what so many of us have wanted for a long time!
The Ghost of Material 3 Past (and Cupertino's Faded Glory)
You open up a new Flutter project today. You get Material Design. You also get Cupertino, because we're supposed to be building for both worlds, aren't we?
The problem is, what you get isn't exactly cutting-edge. Material 3 is here, and it’s been here for a while, but the implementation in Flutter feels… anemic. And Cupertino? It’s a decent sketch, but it’s been living on borrowed time.
You want to build a slick app that feels genuinely at home on an Android device, and then switch gears and have it feel just as idiomatic on an iPhone. You're handed a toolkit that offers a slightly rusty hammer and a slightly bent screwdriver. Sure, you can build something. You can probably even assemble a functional bookshelf. But it's going to look off.
What's the problem?
"Who cares?" you might ask. "It all works, doesn't it?"
Fair enough.
A user can still tap buttons and scroll through lists. But here's the thing: we’re not just building functional tools; we’re crafting experiences. Think of it like this: you go to a restaurant. The food is edible, it fills you up. But if the plates are chipped, the cutlery is mismatched, and the waiter looks like he slept in his uniform, you’re not going to rave about that place, are you? You’re going to remember the feeling.
Native platforms have spent years, decades, honing their design languages. They’ve iterated, they’ve tested, they’ve made users feel a certain way. Android has its Material Design, which has evolved (Material 2 -> Material 3 -> Material 3 Expressive). iOS has its Human Interface Guidelines, which are constantly being refined. These are psychological frameworks. They leverage our ingrained understanding of how things should work, how they should look and feel.
When you throw a generic or, worse, an outdated look-and-feel at users, you're essentially asking them to re-learn your app’s language. You’re adding cognitive load. You're not speaking their language; you’re speaking your language, in a dialect that sounds vaguely familiar but is ultimately alienating.
And for what? Because the truth is, building an application with custom design language is risky, unless you know what you're doing. And most don't, unless we're talking about expert designers, who give you a well-defined Figma file, with all the design tokens and components that you have to recreate.
But when you open an Android app built by Google, that millions use every day; it's Material 3 Expressive. When you open a native iOS app built by Apple, it's Cupertino (and nowadays, Liquid Glass). I don't care what you think about the design itself, but it's there. Are you going to fight it with your design language? Well, it better be better!
Look at React Native. They’re not perfect, by any stretch, but they’ve had a leg up here for a while. Developers can more readily tap into native components and, by extension, native design patterns. It’s not a perfect analogy, but it highlights a difference in philosophy.
Flutter, in its pursuit of ultimate UI control, sometimes seems to forget that the platform itself is part of the user experience.
We’re talking about small things. The way a scrollbar behaves. The subtle animation of a notification banner. The precise padding around a button that just feels right because you’ve seen it a million times on your phone. This is the connective tissue that makes an app feel like a natural extension of the operating system, not an interloper.
Solution?
So, what’s the solution? Flutter needs to get its act together and embrace platform-specific design more robustly. This means more than just a checklist of components. It means keeping pace with the actual, current design languages of the platforms we’re targeting.
Google itself is pushing newer Material Design concepts and the updated guidelines that incorporate elements like Liquid Glass for iOS. Why isn't this front and center in Flutter? Why are we still tinkering with shadows and elevation when the world has moved on to dynamic color and more fluid motion?
Or better yet, why is my Twitter timeline still talking about state management, it's a 2021 topic that we've resolved already (use ChangeNotifier and ValueNotifier, and stop messing around).
We need a Flutter that doesn't just mimic Material and Cupertino, but actively integrates with their latest iterations. It's about building apps that feel less like cross-platform compromises and more like native citizens on every device they inhabit.
The dependency graph for your average Flutter app is already a sprawling metropolis (topic of another article). Adding a few more well-maintained, up-to-date platform-specific design packages isn't going to collapse the system. It's more likely to make the whole damn thing stand up straight.