Reflectly did indeed run on Android, but it was far from what we had hoped it would be like. Overflows failed and as result scroll elements went missing and shadows were cut off in strange ways. Furthermore, animations turned out unbearably sluggish.

We spent a whole week fixing the Android experience — yet still, we had to completely remove shadows and animations from the Android app to make it usable. For the following 6 months, we were caught in an awful development cycle of building for iOS first and fixing for Android second. The promised land of cross-platform mobile development was an illusion. We felt deeply frustrated by this burdensome process.

A Leap of Faith

During the third quarter of 2017, Reflectly grew steadily in popularity. We went from hundreds of new users daily to thousands of new users daily. Everyone loved the app — but as it grew in popularity, so did our frustrations with React Native.

Eventually, we made a decision, in early 2018, to abandon the existing codebase altogether and rewrite everything. The big question was; what to invest in?

A complete rewrite in React Native was out of the question, primarily because of past experiences. I had come across Xamarin in the past but was hesitant to use a technology that used to be proprietary. We thought the safest solution would be to build two new native apps, however, with only a couple of engineers on the team, this option seemed overly daunting and unfeasible within a reasonable timeframe.

We broadened our search and stumbled upon Flutter around Jan-Feb 2018. At the time Flutter was still in alpha and therefore felt like a risky bet to use for our company. After all — we were trying to build something better than what we already had.

After experimenting with Flutter for a little while I and the team fell in love with the cross-platform consistency, near-instant stateful hot reloading, great tooling and high performance of the platform. Upon deeper inspection of Flutter’s source code, I was delighted to find easy readable and well-documented code.

Our biggest concern was the lack of platform packages for local notifications and in-app purchases. Though, these issues seemed quite solvable using platform method channels.

We liked Flutter so much that we decided to take a leap of faith and commit ourselves to rewrite the entire Reflectly app in Flutter within 2 months.

Building the Future of Journaling

Getting started with Flutter was easy. We quickly managed to put together the basic views of the UI. Gone were the days of discrepancies between what was rendered on iOS and Android. It felt great knowing that the UI would be rendered consistently across platforms. No more wasting time writing error-prone platform specific code.

Smooth scrolling and transitions for both Android and iOS

The tradeoff? Being forced to produce better code that takes slightly longer to compose.

Flutter apps are built using Dart. Like Java but unlike Javascript, Dart 2 is strongly typed and object-oriented. Unlike Java, Dart is easier on the eyes and feels more lightweight. Coming from JavaScript, it does take time to get used to the class hierarchies and static typing in Dart. That being said, I feel that the additional effort is well worth it in the long run — maintaining and refactoring our codebase has never been easier and safer.