Hey, it’s Tom, so I’ve spent a couple of last weeks playing with Flutter. After a long time of avoiding multiplatform solutions (because of bad memories caused by Cordova), I decided that this year I will give them a chance again. Today I want to share with you my thoughts about Flutter from the perspective of an iOS developer. Ok, let’s start 😉
Ok, let’s start with what I find really good:
- You can use the IDE of your choice – Android Studio, VS Code, IntelliJ, you can use whatever you want, thanks to this you don’t have to learn both a new language, framework, and IDE at the same time, it also helps to quickly start.
- It’s super easy, and free, to learn it from scratch, detailed documentation, lot’s of tutorials explaining every aspect of app programming, a dedicated youtube channel with many videos, well I’m really impressed.
- The same UI on all devices – this time it’s not only clickbait, in Flutter UI is drawn from scratch, pixel by pixel, this is why it’s possible to achieve exactly the same look on every single device, platform, and OS version. The app will also look the same way not only on iOS and macOS but also on every android phone, regardless of the theme created by the manufacturer. Funny thing is that this is impossible to achieve using native Android programming.
- Tons of ready to use widgets, that save time and allows you to quickly prototype apps that look great either you will choose material UI or Cupertino theme. This is pretty similar to what mobile developers are used to as both Android and iOS offer widgets for most typical use cases, but for web developers that might be a nice surprise. If you don’t like the system widget, you can always customize it, or use built-in layouts to build your own from scratch.
- Hot Reload – if you are developing a more sophisticated app and you have a meeting with designers who want to “move it a little bit right, well actually no, maybe move it a little bit left” then you will love hot reload, as it will save you lot of time. This is just one situation, but it really improves the development process on a daily basis. If you are an Android or iOS Developer you will be surprised how much time does it save.
- Less time spent on testing – if you have one codebase, then you write tests once, this is obvious, but sometimes we forget about such things, this can also be considered as a great time saver, and let’s be honest… nobody likes to write tests 😉
- State management is pretty easy to learn if you have ever worked with React.js, you can just use what you already know, either use props hell or go into much cleaner state management, which concept is really familiar to React developers, we have provider and consumer, that allows us to skip data propagation between multiple widgets which are not really using it.
- Declarative Programming – it demands a different way of thinking, as lot of mobile developers got used to imperative programming, but for React Developers, Flutter looks more like a sugar syntax than a new platform and framework.
Ok, not everything is so great, so let’s talk about those things that annoy me:
- Flutter draws everything from scratch and looks exactly the same on all platforms… this is great if you are writing your whole app in Flutter, but if you want to write only part of your app in Flutter it will most likely look different than the rest written using native SDK, as a result your app will look weird, like a frankenstein… of course you can write Android part of the app using Material UI and iOS part of the app using Cupertino widgets, thanks to that it will look more native, but you will duplicate lot of code, at least whole UI code and I’m not really sure if this will still save your time.
- Flutter is not mature and I feel like it’s missing some broadly accepted architecture standard, Android uses MVP, iOS uses MVC or MVVM and in the case of Flutter, each source code I’ve seen was using its own approach.
- Accessing more sophisticated, platform-specific features still demands writing native code and calling it from Flutter, keep that in mind, because if your app does need to work with Bluetooth, Wi-Fi, custom camera access or any other sophisticated technology it may turn out that you will write a lot of native code and just a UI wrapper in Flutter and as a result, you will sacrifice native feeling and not save as much time as you expect.
- It’s easy to say that you write once, design once and deploy to all platforms, but let’s be honest, mobile UI doesn’t look good as a web, same with desktop. You need to redesign the app and as a result you start using different widgets, which forces you to handle logic a little bit differently. Writing 1 app for Android and iOS is ok, that really works, but I feel like support for other platforms is not really needed, as they already offer better tools to develop great apps.
- Not sure if this is really a big problem, for me this was obvious, but it might not be for everyone. You still need an Apple computer to build Flutter app for iOS, because Flutter SDK uses XCode to prepare a build.
Ok, so you already know what are my key observations about Flutter, so it’s definitely time to sum it up. I really like Flutter and I will definitely spend more of my free time playing with it… but I’m still convinced that it will not replace native development. Flutter is a great tool to rapidly prototype MVP, which you can present to your investors or potential clients. It might be also an awesome solution if you have to deliver the app ASAP to get more time to work on a more polished native solution. But if you have to deliver some more sophisticated app, then you start writing more and more native code and as a result, the profit of using Flutter is getting smaller and smaller… Last but not least, it’s owned by Google and they like to kill things, hopefully, it will not happen to Flutter anytime soon, but at some point… who knows, just keep that in mind 😉
Ok, I hope this post helped you, if you agree or disagree with my insights feel free to let me know in the comment section below. You can watch the video version of this blogpost on my Youtube Channel: https://youtu.be/UuBM126Pf3I