Flutter-ing in Flutter
- Mrinal Jain
- Apr 20
- 6 min read
In 2023 we decided to stop building our iOS app. At the time we had functional native apps for both iOS and Android apps with active paying users. If you have ever built applications, you know that iOS apps are more expensive to build than Android. Our iOS app had over a 1000 paying users, but this was still only 10% of our total users. There were the early days of Pinky Promise. At this point we were still experimenting with core product features, talking to our customers everyday, and focusing deeply on figuring out what was working for our patients. With a small lean team, we conserved our resources and decided to pull the plug on iOS. As soon as we did, our speed of experimentation doubled. We were able to focus on the Android app, quickly prototype and test new features, and quickly get feedback from a much wider demographic.
By November 2023 we had built a product that our patients loved. We had completed 6000 AI-assisted consultations. We had something special on our hands. It was now time to bring back our iOS app. And along with that we also decided to introduce a web version of our product.
Why web, you ask?
92% of the women coming to Pinky Promise have never paid online for a healthcare product before. Convincing them to download an app without first demonstrating value. With a web app, they can click on a link and start consulting immediately!
A web app makes it extremely easy for us to run quick, low fidelity experiments to try out new ideas and keep iterating.
When we embarked on this project we knew our setup and team structure would make it prohibitively difficult to support multiple codebases - that we needed a single codebase across platforms. To find a framework that would stand the test of time and scale. After spending some time with this question, we finally decided to build the next version of the Pinky Promise app in Flutter. The FlairLabs team collaborated with us on this project to bring this to life. This decision has more than paid off, and today we have a stable, scalable, and highly performant cross platform app built on flutter.

In this post, Mrinal Jain from Flairlabs talks about his journey of working with us to build this app, the things that worked well and of course some of the bigger challenges of working with flutter as a framework. There were a lot of questions in our head about flutter that we answered through this process, presented here.
-- Akanksha Vyas
Developing the Pinky Promise patient application using Flutter was an exciting and rewarding experience. The framework’s flexibility and speed allowed for rapid iteration and deployment based on user feedback. Hot Reload kept productivity high, and working on a platform that serves women's health was fulfilling, knowing the positive impact it could have.
The development of Pinky Promise was a collaborative effort, where each team member contributed their expertise to create a seamless user experience. From design to development and testing, we maintained a strong feedback loop, ensuring that user needs were always at the forefront. Flutter’s versatility allowed us to quickly test ideas across multiple platforms without the need for separate development teams for iOS, Android, and web. This was particularly useful in maintaining consistency across the user experience, ensuring that all platforms shared the same look and feel.
Why We Chose Flutter
When we started building our app, one of our key goals was to reach users across iOS, Android, and the web—without juggling three separate codebases. Flutter stood out early on for enabling true cross-platform development with a single codebase. But if you’re thinking, “React Native does that too, and it’s more popular,” you’re right. So why did we still choose Flutter? Let’s break it down.
One Codebase, All Platforms: With Flutter, we were able to target Android, iOS, web, and even desktop platforms like Windows, macOS, and Linux using one Dart-based codebase (if we ever choose to). That level of platform reach out of the box is hard to match—React Native, Xamarin, and others are still catching up when it comes to stable support for web and desktop.
UI That Actually Looks the Same Everywhere: Flutter doesn’t rely on native UI components. Instead, it uses its own rendering engine (Skia) to draw every pixel. The result? A consistent, pixel-perfect UI across all platforms, regardless of device or OS version. No weird visual quirks or layout bugs just because a user is on an older Android/iOS version or a different screen size.
Native-Like Performance: Unlike JavaScript-based frameworks that rely on a bridge to talk to native modules (often a bottleneck), Flutter compiles directly to native ARM code using ahead-of-time (AOT) compilation. For us, this translated to smoother animations, faster load times, and overall better performance—even for real-time features and complex UIs.
A Full UI Kit, Built-In: Flutter ships with a massive library of customizable widgets following both Material Design and Cupertino guidelines. That meant we didn’t have to rely heavily on third-party UI kits. Everything from buttons and lists to complex layout structures was available out of the box—and highly customizable.
Fast Iteration with Hot Reload: Flutter’s hot reload was a huge productivity boost. We could make changes to UI or logic and see the results instantly without losing app state. In a fast-moving dev environment, this helped us prototype, iterate, and ship features faster.
Great Dev Tools: Flutter’s integration with Android Studio and VS Code is seamless. The built-in widget inspector and performance monitoring tools helped us diagnose and fix issues quickly, especially for platform-specific bugs. Compared to other frameworks that require multiple external tools (like Chrome DevTools, Flipper, etc.), Flutter just felt more unified and developer-friendly.
Growing Ecosystem & Community: We found Flutter’s community to be incredibly helpful, and the ecosystem is growing rapidly. Most of the packages we needed—chat, real-time notifications, payment integrations, GraphQL clients—were stable, well-documented, and actively maintained.
Widgets for Real-World UI: We weren’t just building generic screens—we needed complex interfaces like health records, appointment cards, and doctor profiles. Flutter’s widget system made this straightforward, without having to compromise on design or UX.
Seamless Backend Integration: Whether it was Firebase for auth and messaging, Razorpay for payments, Socket.IO for real-time consultations, or GraphQL for efficient data fetching—integrating services with Flutter was smooth and hassle-free. That meant we could focus on building the product, not fighting with platform-specific quirks.
Performance That Scales: One of the common concerns with cross-platform frameworks is whether they can truly deliver a native-like experience, especially as your app grows. Flutter proved itself here too—providing smooth, responsive interactions, performant animations, and reliable access to native APIs when we needed them.
In short, Flutter gave us speed, consistency, flexibility, and performance—without forcing us to compromise on user experience. For a product team looking to move fast and build beautifully across platforms, it checked all the right boxes.
What Flutter Didn’t Get Quite RIght
Cross-platform customization (especially web): As much as we loved working with Flutter, it wasn’t all smooth sailing. One of the bigger challenges we hit was around platform-specific customizations. When we needed to tailor features for Android or iOS, those changes would sometimes cause unexpected issues on the web. And vice versa—tweaks made for the web didn’t always play nicely with native builds. Keeping everything in sync across platforms took some extra effort and careful coordination.
Community: Another small bump in the road was Dart. While it’s a clean and well-designed language, it’s not as widely adopted as JavaScript or Kotlin. This meant that finding answers to niche questions—or community-vetted best practices—could take longer than expected.
Plugging into Native code: And finally, for things like deep native integrations—think camera controls, Bluetooth, or background services—we often had to drop down into native code. While Flutter makes this possible, it’s not always straightforward and occasionally slowed us down when working on milestone-critical features.
None of these were deal-breakers, but they’re good to keep in mind if you’re planning to go all-in on Flutter. For us, the benefits far outweighed the trade-offs—but every team and project is different.

This project not only allowed us to deliver a high-performance, cross-platform app but also gave us the flexibility to continuously improve and innovate. The combination of Flutter's powerful development capabilities, GraphQL's efficient data management, and Firebase’s robust backend services made it possible to build a feature-rich platform that provides real value to users.
The project has been a huge success, not only from a technical standpoint but also from the perspective of making healthcare more accessible to women. Today over 200,000 women have used Pinky Promise for their healthcare.