Skip to content

Building Fully Cross Platform App with Flutter

Flutter Fully Cross Platform

In this article I’m gonna explain how I’ve build Fully Cross Platform Native Apps with Flutter. The Application I’ve build is an App Center that is listing and will contain all future software products. 

About App Center

Some time ago I rented the domain “App Center . Online”. It was cheap, but I didn’t manage to do something meaningful with it because of several Real World Reasons. I’ve moved what I’ve done there on https://programtom.com/appcenter.online/. For shortness, You could also open https://programtom.com/apps or https://programtom.com/appcenter

Most Cross Platform Articles you’ll read

Most Articles you’ll read will compare the frameworks that build Mobile Applications Only. The blog posts you’ll read will be generic – they list the same pros and cons, advantages and disadvantages over and over again, because of SEO benefits. Here, You’ll read a little bit more and from different Aspect.

Flutter’s Core is Skia – a drawing open source library written in C/C++ and also ported to Web with WebAssembly/dart2js. Every Platform binary will be dependent on the port of this library. In some sense, it is like Java, but, limited to the drawing/user interface interaction layer and everything else is implemented with Plugins. 

Android App

You’ll be able to build Android App on any platform using Flutter, because Android SDK works everywhere – Linux, Windows and on Mac. 

iOS App

iOS apps sadly can be build only on MacOS platform. You could buy a Mac, hack around with MacOS virtual machine, or use some cloud service that will build the app for you. Also, the way Apple has enforced app distribution, there is no way a binary published on the Internet to be installed on your iPhone or iPad. The non-[App Store] way is to have the certificate/key/approval from the specific device and to have it bundled/signed in the build. It is hard and close to impossible.

Enabling Desktop Apps

Before getting your hands dirty with platform specific problems – make sure to check the latest references from the origin – the creator of the framework – by going to https://flutter.dev/desktop. Otherwise you will find yourself some hard time. When you add dependencies, update flutter or introduce breaking changes – First thing to do should be:

  1. Check what Flutter Doctor says
  2. Clean the Platform Specific Directories (run “flutter clean” or delete manually the platform directories and run “flutter create .”) 

Otherwise the builds will most likely fail. After re-running build and it fails – then dive into specifics.

MacOS App

Same as iOS – about the building side. The running [executing your end result] side may be a little bit more open. There is an App Store for Desktop Apps, but, being the Administrator of your Mac, you could potentially allow execution of an app downloaded from the Internet. This setting is located in the System Preferences – Security/Privacy. It it not recommended in general – especially not knowing who the developer of an app is.

Windows App

I had no problem building an Exe for my app. If you don’t have a Windows OS License, Microsoft offers a Virtual Machine that cannot be activated, but it will work for 3 months: https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/. They will probably release another Image in the future, so you should have your building/development process automated and migratable. This is standard way of thinking nowadays with the containerization with Docker/Kubernetes. 

Linux App

If you are running Windows machine – there is a subsystem for Linux that you could use along side your OS. There are also the options to have a Linux container in docker, a Virtual Machine, or installation of some Linux Distro (Ubuntu is preferred as Canonical are the main Linux Contributors to Flutter)

If you find yourself in hard time building a Linux App with Flutter, here are some links I’ve collected:


CMake Error at /usr/share/cmake-3.16/Modules/FindPkgConfig.cmake:463 (message):
A required package was not found
Call Stack (most recent call first):
/usr/share/cmake-3.16/Modules/FindPkgConfig.cmake:643 (_pkg_check_modules_internal)
flutter/CMakeLists.txt:28 (pkg_check_modules)
Building Linux application…
Unable to generate build files

Make sure you follow the steps in the – Enabling Desktop Apps section.

Cross Platform Plugins

In Flutter, every thing outside of pure displaying is implemented with Plugins. Make sure the extensions you use are multi-platform. Otherwise, you will not be able to magically produce Native Platform Executable with simple Flutter build without changing the code. That is the reason why in my Generator App, lately, I’ve abandoned sqflite, and my own IndexedDB mapping for the Web for now. In the future I may unite these with https://pub.dev/packages/sqlite3/example. One semi-optimal option is to cache the network results in Shared Preferences. Another option is to try other storing plugins – moor, hive, box, etc.

There are also tons of other functionalities, besides storing data – that are not truly cross-platform and they may brake your spells – file picking, sensor access, different UX expectation (scrolls, clicks, taps, visual component arrangements, etc.

Distribute a Zip with the building Result

Your custom app executable file will – in most cases be smaller than the platform dependencies. In the build directory you will find .so files for Linux, DLL files for Windows, .js files for the Web etc. I could compare these libraries to the Java Runtime. Java Programs (jars) require from the users to have the Runtime Environment installed. In comparison, Flutter release apps don’t require any library pre-installed, but you’ll have to ship the framework – platform files along side with the app executables.

Leave a Reply

Your email address will not be published.