I’ve been reading another Flutter-praising article that mentioned an application supposedly written in this framework. According to the author of the article, the application was indistinguishable from a native iOS app using Apple-provided controls from UIKit. I found it hard to believe because every Flutter app I’ve used had serious UI/UX issues compared to most native apps. So I decided to give it a try.
The application actually felt like a true native app (mostly) but it turned out, this wasn’t the merit of the Flutter, because the app might not use Flutter at all.
The application in question is Realtor.com. You can guess it’s used for searching apartments. But most importantly, it’s the first application you see when you open the Flutter showcase page, so it has to be written in Flutter, right? I don’t know about it’s Android version, and I don’t want to, so let’s just take a look at the iOS one.
My primary iPhone is jailbroken, so I have 2 reliable ways to check how any iOS app is written and which frameworks it uses: view hierarchy inspection and bundle inspection.
The primary characteristic of any Flutter application is that they don’t use native OS controls unless you bridge them by yourself; because Flutter draws everything on its own and just mimics native controls of the OS. For example, in the image below you can see the view hierarchy of 2 apps.
The left one is native: it uses a lot of default iOS controls (the ones with “UI” prefix) and some of the custom ones. But the most important thing here is that you can see the entire hierarchy.
On the other hand, the Flutter app’s hierarchy is almost flat. There are a few native controls that are required for any iOS applications, and also there’s a bridged web view. The whole application’s UI is contained inside FlutterViewController, and you can’t see what’s inside of it at all, because it’s just a canvas.
Application bundle is just a folder with an executable file and a bunch of stuff that application needs, like code signature, resources, description file, and most importantly — it’s dependencies. The easy way to check if the application uses Flutter is just to check if it has Flutter as a dependency — that’s it.
Let’s start our inspection with the view hierarchy. The Realtor has 5 tabs, and as you can see below, the hierarchy of every tab looks exactly like a native app’s hierarchy. Moreover, none of the tabs have FlutterViewController inside them at all.
I went over the tabs and checked some of the screens inside, and haven’t found any screen that was made using Flutter or at least had an instance of FlutterViewController.
So, no Flutter at all? I had the same question and decided to check if Realtor has Flutter at least as a dependency.
Turns out, it has. But it also has a few native dependencies, like SnapKit, which is used to simplify layout code in native iOS applications. But more importantly, it has a lot of .storyboardc and .nib files, which are compiled versions of Xcode Interface Builder files (.storyboard, .xib). And you can probably guess that you can’t use Interface Builder to create Flutter screens.
So, the Realtor app has Flutter dependency, but none of the main application’s screens use it. What could that mean? I see a few options:
- The application uses Flutter, but only for a few screens that might be not that important.
- The application actually doesn’t use Flutter at all.
- The application used Flutter a lot in the past but decided to abandon it.
- Only the Android version uses Flutter (why would you do that?)
In all of the cases, a question arises: is it fair to put this application in the first position of the promotional showcase, or any position at all? Because in all of the cases above, a statement “the Realtor app is written in Flutter” isn’t an absolute truth. In some cases, it’s not a truth at all.
How about some honest marketing, Google?
UPDATE: Turns out Realtor actually uses Flutter, but all of the Flutter screens are under A/B tests, which goes back to my first conclusion. It might give a lot of people an impression that the whole app actually is written in Flutter, and that could lead to a false conclusions or expectations about the experience it provides to the end user. I believe that this isn’t the correct way to promote cross-platform framework.