Why Flutter might be the best choice for your next project, and when to avoid it

25 Nov 2021 | 14 min read
business benefits of flutter app development

Have you heard about Flutter? Thanks to all those fancy talks at Google IO, an impressive toolset backed by Google itself, developers’ love and forum discussions it’s getting more and more traction in both the startup & corporate community. However, Flutter is still quite new, and a lot of people are asking themselves if it’s mature enough to be used in something more than a prototype.

In this article I will attempt to explain why Flutter is so good at what it does, and when it’s the right tool for the job.

Like every framework, it has its strengths, but it also has several weaknesses. This article will provide you with all the necessary knowledge to make an informed decision if Flutter is the right choice for your next project.

But first, let’s talk about cross-platform app development in general. 

What is cross-platform and why is it getting more popular?

Cross-platform is a term used to describe a framework that allows you to use a single codebase to deploy an app to multiple platforms like the Web, iOS or Android. Here is a list of the most popular ones:

While all of them have their own strengths and weaknesses, today we are talking about Flutter. This is because, unlike other frameworks, Flutter supports all of the following platforms:

The main advantage of Flutter

The ability to target so many platforms at once, while having to put in significantly less amount of time to make them work and look like native apps is a huge advantage to have over your competitors. And I want to stress the word “less“, because targeting 6 platforms with one codebase does not mean you will have to do 6 times less work than targeting them individually.

This is because when you’re using any kind of cross-platform technology, you still have to prepare separate UI and UX flows for the different platforms, and connect your code to native functions (like the camera), that are implemented differently on each platform.

A good analogy would be making a car base model, and then releasing slightly modified versions of it: a sedan, a coupe, hatchback and so on. Each release is somewhat different, but all offer the same visual and functional aesthetic and share a lot of components.

cross-platform explained with different car models

This is way faster than creating completely different models with different parts for each format.

Like car formats, each platform has its own quirks that have to be handled individually and might affect the base code. And this is why cross-platform developers also need to know the platform they are targeting, and how to communicate with it using its native code.

Making cross-platform code simpler

Another strength of Flutter is its native platform channels. It’s an interface that allows your developers to seamlessly communicate with native code on the device, and implement more complex features.

flutter native platform channels in action

Some features, like taking photos using the camera, cannot be implemented purely in Flutter, because they need more than just rendering something on the screen, or connecting through the internet. We need to talk to the hardware using its operating system’s language. And this is exactly where Flutter shines the most – its platform channels.

Flutter’s platform channels

Platform channels are a way of communicating with the underlying system to trigger some specific actions and get a result back.

Thanks to this abstraction, your Flutter code will see all the different platform implementations of the camera functions as one interface.

In other words, when your Flutter code calls a method to take a picture, it does not care which platform you are using, since that part is handled by the platform channels, which “channel” your method call into the right native implementation. This simplifies your code a lot and makes it more maintainable in the future.

Other frameworks (such as React Native) also have a way of dealing with this problem, but Flutter’s solution is far easier to work with and to maintain in the long run.

No need to reinvent the wheel: Native code in libraries

Like most frameworks, Flutter uses a package manager, which makes it easy for developers to manage their project libraries. It is also able to recognize native code within those libraries, allowing the package maintainer to support any kind of platform they want.

Most libraries are written in pure Dart, so you don’t need to worry about platform compatibility, and the ones that contain native code usually provide a list of platforms they support.

You might be thinking: what if a library does not support a platform I’m targeting? Well, this is a very rare situation, and it usually happens when using libraries that target some very specific device functions, like ML acceleration, operating system functions, 3D bindings, etc.

If you find yourself in a situation where you know that your target platform supports a certain function but the library does not implement it, then your development team can always fork the repository and implement it themselves. It’s not an optimal solution but a possible one.

A lot of common native functions are already covered by the community libraries, which means you will be able to get your app up and running in no time. Here is an example list of libraries that include native code, have very good support and documentation:

NameFunctionPlatforms
Flutter BlueBluetoothAndroid, iOS, macOS
GeolocatorGPS TrackingAndroid, iOS, macOS, Web
Google Maps FlutterGoogle MapsAndroid, iOS
LibUSBUSB Interface BindingsAndroid, iOS, macOS, Linux, Windows
CameraCameraAndroid, iOS, Web
Just AudioAudio PlaybackAndroid, iOS, macOS, Linux, Windows, Web

Deliver quickly with a single codebase

Now that we got the technical side out of the way, we can start to understand the bigger picture here. Flutter is essentially allowing your team to define the UI and app logic in a single place, without the need for code duplication. Any deviations resulting from platform differences, like the way hardware features are implemented, are abstracted away and are visible as one coherent interface.

  • Feature parity on all platforms
    Since all your logic and UI comes from the same code, then no matter what you change in your Flutter code, it will be visible on all distributions instantly.
  • Logic issue parity on all platforms
    When an issue related to your app logic is solved, it solves the problem on all platforms. If you had several native versions of your app, the problem would have to be solved for each platform separately.
  • Native issues separation
    Native issues related to things like Bluetooth or the camera come up individually on each platform. That leads to a number of things. For example, if Apple decides to introduce a breaking change to its camera API, it won’t affect other platforms.
  • One team
    When assembling a team you would essentially only need Flutter developers. This simplifies the hiring process and makes the development workflow much more efficient.
  • Faster time-to-market
    Your app logic and UI only have to be written once. The amount of time you save goes up linearly with each additional platform target.

Hiring for Flutter is easy

Flutter has been around for several years now and has gained a lot of popularity since then.

This means that if you were to pick any mobile or web developer, there would be a high chance that they have tried Flutter out already, or even wrote a small project in it. You can expect to find plenty of developers with 1-2 years of experience in Flutter, but the most important thing would be to look at their past experience. 

Flutter should be thought of as a tool rather than a platform. Due to its young age, there are not a lot of established ways of handling things like state management, or persistence. This is why it’s important to look at the developer’s experience in your platform of choice since that will be a good indicator of how they will perform with Flutter.

Flutter is very easy to pick up

Flutter utilizes concepts like Widgets and reactive programming, which should be familiar to React developers in particular. Any mobile developer, cross-platform or not, can pick up Flutter in no time and apply their knowledge. On average, a senior mobile developer can master Flutter in approximately one month.

When not to use Flutter

The most important reason to choose Flutter is to gain more versatility and most importantly velocity. Any factors that affect those two metrics may diminish the value that this framework can bring to your project. Here is a list of things you should look out for:

Your app is centred around a native-heavy functionality

While Flutter excels at crossing the native bridge using platform channels, it does not come without its costs. Having most of your features target a native function, means you will have to write a lot of native code as well as establish platform channels and then write interfaces for them in Flutter. 

Take Bluetooth as an example: there are libraries that already provide this functionality and bindings, but if you want to go for some custom solution that uses the full Bluetooth specification, you might find that those libraries are lacking. In this situation, you would need to extend this library or even write your own. The amount of work that would need to be put into developing such a library outweighs the benefits you gain from Flutter. This is magnified even more if you’re targeting only one platform.

You need 3D graphics in your app

Flutter uses Skia under the hood, a 2D graphics library that cannot render 3D images. There have been talks about implementing OpenGL bindings into Flutter, but those solutions are nowhere near completion. Production use would be out of the question.

You are targeting only one platform

This would nullify all the benefits of a cross-platform solution and would add unnecessary overhead when developing your app.

You are not targeting mobile 

This depends on multiple factors, but usually, when targeting exclusively other platforms than mobile, it’s better to use their native frameworks.

Summary

Flutter is a versatile tool that will allow your team to make beautiful, multiplatform applications that will be appreciated by your clients and developers alike. It has a strong community and a variety of ready-to-use libraries that will speed up the development significantly, but its Web support is still being worked on, and its flaws should be taken into account when choosing to target this platform.

Out of all cross-platform frameworks, Flutter is definitely the most promising one, with the widest support of platforms and strong, stable support for native functionalities.

However, if your app is using advanced native tooling, like 3D or vendor-specific libraries, it might be worth reconsidering going fully native, especially if you are targeting a small number of platforms.

Unless your app has very specific, hard, technical requirements that are bound to a specific platform,  Flutter will be the perfect companion to quickly bring your vision to life, while providing a beautiful user interface, and great programming experience, making both your clients and developers happy.

The controller of your personal data is Miquido sp. z ograniczoną odpowiedzialnością sp.k. with its registered office in Krakow, ul. Zabłocie 43a, 30-701 Kraków. We process the above information in order to answer your questions, contact you and conduct business communication, and if you tick the checkbox, to send you messages containing commercial, business and marketing materials.
The basis for the processing of your data is Miquido's legitimate interest - informing customers about news and changes to our offer as well as providing information about products that may be useful in their business. You can unsubscribe from the marketing communications at any time. You also have the right to access data, the right to request rectification, deletion or limitation of their processing, data transfer, the right to object, as well as the right to lodge a complaint to the supervisory body. Full information about processing of personal data can be found in the Privacy Policy.

Show more

Want to talk about your project?

Hi, I’m Sebastian, Account Executive at Miquido. Fill in the form to the right and I’ll get in touch with you soon!


    0/2000

    The controller of your personal data is Miquido sp. z ograniczoną odpowiedzialnością sp.k. with its registered office in Krakow, ul. Zabłocie 43a, 30-701 Kraków. We process the above information in order to answer your questions, contact you and conduct business communication, and if you tick the checkbox, to send you messages containing commercial, business and marketing materials.
    The basis for the processing of your data is your consent and Miquido's legitimate interest.You can unsubscribe from the marketing communications at any time. You also have the right to access data, the right to request rectification, deletion or limitation of their processing, data transfer, the right to object, as well as the right to lodge a complaint to the supervisory body. Full information about processing of personal data can be found in the Privacy Policy.
    Show more

    We have received your message. One of our colleagues will get back to you shortly. Have a great day!