Rating: 3.11 / 5 Based on 9 reviews
Cross-platform development is a game-changer for developers and business owners who aim to improve their workflow, optimize resources, and extend their app’s reach across various platforms. However, as with any technology, it comes with its own set of challenges that depend on the framework, its readiness and advancement on the release date, and its engagement in developing improvements and new features. Cross-platform solutions provide significant time and cost savings. However, you can encounter drawbacks with some platform-specific features and performance, and that’s where it’s worth being aware of the differences between each framework since they may impact your final decision.
We examine two frameworks, their advantages and limitations, so you can decide which one is right for your cross-platform app development: Flutter or .NET MAUI.
Flutter is an open source framework for developing cross-platform applications first published by Google in 2018. It’s used with Google’s programming language Dart and supports operating system such as: Android, iOS, desktop (macOS, Windows, Linux), web, and embedded devices (wearOS, watchOS, Android Auto, CarPay, and many others). We encourage you to check also our article on Flutter pros and cons.
.NET MAUI is an evolution of Xamarin from Microsoft, released in 2022. It's an open-source, popular cross-platform framework using C# and XAML for the development process that, compared to Flutter, has fewer platform options: iOS, Android, Windows and macOS.
When choosing Flutter or MAUI in case of performance, we need to remember that while MAUI is still young, it takes advantage of .NET optimization. Certain types of applications can benefit from that, but it also uses a layer of abstraction (Intermediate Language) to compile to native code. On the other hand, Flutter with its direct compilation to native code and GPU rendering, delivers better performance, even on older devices. Flutter when it comes to mobile app development also uses Ahead-Of-Time (AOT) compilation, which results in faster builds and smaller application size, whereas MAUI only uses AOT on iOS devices with some limitations, as not all libraries support it.
Both frameworks have a Hot Reload feature that allows for reloading the app without reinstalling it and losing state. This way, changes are visible and testable immediately. Unfortunately, MAUI still has some work to do, as Hot Reload is not as reliable as it is in Flutter, and it sometimes still doesn’t work as expected, forcing the rebuild. It’s said to work for both XAML and C#, but although it might reload C# code, it doesn’t change the UI, and the developer needs to navigate to another page in the app and go back to see the change. Moreover, Flutter has a Hot Restart feature that recompiles the app and resets its state but removes the need to rebuild it when, for example, adding a new resource. All that extremely improves feature delivery times and development cycles with Flutter.
One of the ways of starting your adventure with popular cross-platform technologies, such as Flutter or MAUI, could be by using it in already existing native applications. To do this, Flutter offers the possibility to embed a Flutter widget or a module directly with iOS and Android codebase using the add-to-app approach. Also, native SDKs can be used in Flutter via platform channels to execute code directly in native languages if what is offered by Flutter and its packages is not enough for our use case.
At LeanCode, almost all projects have about 10-15% native code to provide applications with native features - we know the drill. Sadly, MAUI doesn’t give us the same or comparable flexibility, as we need to rely on specified APIs. Flutter application has platforms’ projects alongside its own, which makes it really easy to add native code and integrate with any native package, as we get to control native files, like Gradle on Android or Podfile on iOS. In MAUI it’s not possible, as we cannot use native language and we don’t have free access to native dependencies. Although .NET has a large set of libraries that we can easily use in MAUI as well, there aren’t that many mobile packages. We’ll have a lot of trouble getting anything besides that to work there, as native libraries need to be converted to be used in MAUI for each platform separately.
MAUI applications can use Xamarin plugins, but some of them have not yet been updated to be fully compatible with MAUI, preventing crucial functionalities, such as payment getaways or Huawei-specific services, from working in the new framework. Flutter, on the other hand, has proved to provide easy integration with various plugins and APIs from a constantly growing set of packages.
Achieving uniformity across multiple platforms in MAUI could be a challenge, as it uses native UI components depending on the platform used. In Flutter, which has a large pre-defined set of widgets, it’s up to the developer, as widgets are platform-aware but also customizable. Also, Flutter, using a canvas to draw on the screen, is effectively in charge of every pixel. The application can look the same on every platform or be platform-specific by using proper widgets. It even allows the developer to use a CustomPaint widget to draw anything on the canvas for the user to see. Flutter, by its easy and intuitive tools, encourages developers to use small, reusable, and immutable components, which leads to a smaller codebase and reduced bug count.
MAUI, compared to Flutter, although having a longer history in Xamarin when it comes to supporting desktop platforms, provides fewer gestures, pointer events, and keyboard shortcuts on both mobile and desktop applications, which is crucial for a good user experience and accessibility.
While MAUI is dominated by using MVVM patterns, Flutter has many different approaches. Although it might be harder to choose from so many options when making any decision about an application's architecture, don’t worry—we’ve done it all for you already in our article on the Flutter mobile app architecture.
Although both Flutter and MAUI are open source and free to use, development might come at a cost with Microsoft's framework, as using Visual Studio for Enterprise needs a paid license. There is a preview of Visual Studio Code’s plugin for MAUI, which is a free environment, but it still has many limitations, like no Hot Reload, poor XAML support, and not fully tested iOS and Xcode compatibility.
Moreover, MAUI still has bugs in important features and tooling. Although a lot of work is put into fixing them daily, the team working on it is quite small.
Active community, support, and available resources are very important when it comes to developing and maintaining a fast-growing application. So, which one wins in that field—Flutter or MAUI?
Although MAUI has the .NET community’s support and benefits from established Xamarin’s ecosystem, Flutter is more popular when it comes to cross-platform apps and development tools - its community is larger and more active. There are many contributors to third-party packages, but also Flutter and Dart repositories. When it comes to MAUI, unfortunately, many C# developers already changed their stack to other cross-platform frameworks, including Flutter. All that is because the evolved MAUI is not that different from Xamarin, and at the same time, migrating all complex features takes too much time and effort.
Flutter is known as easy to learn for both beginners and experienced developers, whereas MAUI has a more complex architecture and steeper learning curve. Flutter does require learning a less popular language than C# — Dart programming language — but both have similar syntax. While C# is an imperative programming language, where you have to describe how the app does what you want it to do, Dart is declarative - it’s enough to state what it should do without specifying its flow. This makes Flutter more progressive and maintainable.
There is more documentation, tutorials, and content on forums like StackOverflow for Flutter than there is for MAUI. LeanCode itself brings a lot to the table - we share knowledge about Flutter, publish new open-source packages, and participate in and organize Flutter meetings and conferences. We also have prepared many internal tools to ease into every new project, including our CoreLibrary with strongly typed contracts that ensure coherent communication between the server and the application but also speed up typical features that most mobile apps need.
We all want fast and efficient development. Choosing Flutter or .NET MAUI for cross platform mobile applications should take into account developers’ expertise, preferences, and project requirements. Still, performance, productivity, and cost cannot be ignored.
MAUI seems like a good choice when the developer’s stack consists of C# and .NET, as code between C# projects can be copy-pasted and tools are familiar and integrated with .NET. In that case, choosing MAUI for building a prototype or a small application can be a better choice. On the other hand, this could be hard for a beginner in programming or when a project’s requirements are complex, and we need effectiveness and balance between time, cost and quality - that’s where Flutter comes in.
Using Flutter to create cross-platform applications is a better solution because, with its smaller yet more effective codebase, it guarantees fast feature delivery and great user experience. There are many examples of successful use of Flutter for enterprise apps. Additionally, when choosing to work with a company like LeanCode, you also get high standards when it comes to Flutter app development, deep framework understanding, and experts in not only this field but also in backend development, user experience understanding that is reflected in the defined user interfaces and app quality assurance with Patrol - our open-source UI testing framework.
You don’t have to worry about a transition from Xamarin to Flutter, as the syntaxes of both languages are quite similar. Learning Dart should be a smooth sailing experience. Moreover, we have a handy article for you on migrating from Xamarin to Flutter.