As a React developer, I tried, as much as I could, to like React Native, but in the end, every minute i spent with it was a waste of time. Every single day, something would go wrong and drive my attention away from my app. One day, I would do something that looks good in a platform but bad in another. Another day, Expo builds would fail for some bizarre reason. But like someone else mentioned, the package hell is real. You update one package and another package will fail in the most cryptic way possible. Stay away from React Native. This project is a mistake.
In the other hand, I had one of the best experiences in my life with Flutter. Everything is extremely well designed. 100% of the problems I had with Flutter dev, weren’t in Flutter itself. For example, sometimes I needed some magic out-of-flutter configuration to make Firebase authentication to work on iOS. Sometimes Java runtime problems would prevent the Android emulator to run. But with flutter itself, I had the best experience. It’s a god sent.
Flutter if you value your sanity. RN is clunky and my builds would fail with some cryptic messages after updating. This was 3 years ago though so things might have changed. Flutter is mostly smooth sailing apart from some hiccups on iOS in the past with animation heavy apps. Tooling(testing,debugging,packaging) is integrated and dart is getting better every year.
I actually really enjoy React Native with Expo. The over the air updates allowing me to bypass the app store approval process for minor changes are a game changer. React Native renders Apple's UIKit which looks and feels much better than Flutters attempt to emulate it. It's also much easier to make Android Apps look like an Android app with Material design while iOS apps look like their made for iOS. Flutter for web just draws everything in a canvas so it's not accessible and the resulting file size is massive. While with React Native I can leverage Solito to run the same code base as a Next.js application for the web.
Have you considered using Native? The reason I mention this is that Native mobile development has come a long way with recent additions like Swift+SwiftUI for iOS and Kotlin+Jetpack Compose for Android.
Some things to consider.
1. You will have to deal with the iOS and Android respective build systems and updates. Apple likes to force updates on developers (new to update Xcode + MacOS to leverage newer SDKs). Adding React Native or Dart/Flutter adds one more build system to learn along with another set of dependencies (node.js, etc) to keep up to date.
2. Both SwiftUI and Jetpack Compose are defined using Declarative UI, which you will find similar to what you experienced in React+Typescript. A lot of the paradigms translate well and I believe Swift and Kotlin are somewhat similar.
Overall, if I had to choose between React Native vs Flutter, I would choose React Native. It is a proven solution deployed by lots of production apps. The documentation is extensive and examples are readily online along with 3P libraries. Facebook is committed to React and its development, React has a large developer community, and you will benefit from using Native UI widgets and re-using your Typescript background.
React Native suffers from package hell and is not native. Flutter is also somewhat in that scope. If you want C# you can try Xamarin, though I have zero experience with it.
In any case, I'd never use React Native again, and stick to Flutter or Xamarin.
If you have nothing too complex (like a "show information only" app consuming simple web apis), you could go for Avalonia UI, MAUI or Uno Platform - because you already know C#, but if you want to build something serious, learn Flutter. Be aware that this is not as easy as it sounds - the core concepts are a bit different from C# and you can't apply your knowledge 1:1.
There is also Ionic / Capacitor (JavaScript), but the apps felt pretty slow and often crashed within my tests.
I'm totally into AvaloniaUI and maybe a bit biased, because I think this is the most promising approach in C# for now, but since this is more a community effort and not supported by microsoft, developer wise it is not the same experience as MAUI. And C# pretty painful, if you plan to use any Hardware Apis (Audio, Video, Camera, Gyroscope, etc.) with the most modern approaches. I haven't tested Uno Platform yet, but it feels like it's somewhere between Avalonia and MAUI...
## Flutter (recommended)
+ cross platform
+ well designed
+ fast
+ good libraries
- steep learning curve
## .NET MAUI
+ easy to learn
+ supported by microsoft (it's not gonna die too soon, although I would love to see go more effort in Avalonia UI)
- Not really cross platform (no linux)
- Weird build errors (microsofts build system is horrible)
- Documentation is not up to date
- Often missing native device / library support (camera, audio-player, Drag&Drop, OnMouseOver, Gestures etc.)
## Avalonia
+ easy to learn
+ promising community effort (quick response times, huge progress)
+ "fast and good" internal design (runs on raspberry framebuffer)
+ cross platform (win, lin, mac, ios, android, wasm)
- documentation (it was a really huge effort to find the best project setup - avalonia.xplat)
- support (small team, huge todo list)
- Often missing native device / library support (camera, audio-player, Drag&Drop, OnMouseOver, Gestures, SecureStorage, etc.)
- Weird build errors (microsofts build system is horrible)
I tried Flutter for the first time for a hackathon and was able to make a pretty nice looking app with it, complete with a custom audio player UI talking to an API, in around 24 hours. Never tried Dart before that. My code wasn't pretty but I'd also say the learning curve is not too steep, especially because the hot reload is so good you can easily iterate and try things.
I had a completely different experience (maybe I'm a perfectionist or just NOT smart enough). Wrapping my head around futures and the slightly different async/await approach was hard. The component tree had some specific differences and of course I did not know which libraries to take...
Well, maybe it is just my personal problem and should not prevent others from using it.
Would you rather work in the React and Typescript you know leveraging all that experience with a rapidly maturing platform (check out https://expo.dev/ for instance.)?
Or a framework few others use written in a language Google is likely to drop support for randomly?
I like flutter. My biggest fear is that one morning I will wake up reading that google has killed it. The community is so slim that it will not sustain on its own.
I would, hands down, go with Flutter. The developer experience is better than any other project. It's clear there is an attention to detail in the core team that is rare.
The resulting product is, while not always 100% perfect, head and shoulders better than anything I've ever seen produced by something like React Native, Ionic, etc...
If you have experience with C#, then you really don't need to go out of your way since you can use either MAUI or Avalonia (the former is the successor of Xamarin Forms, targeting native controls, while the latter offers a consistent look across all platforms).
In the other hand, I had one of the best experiences in my life with Flutter. Everything is extremely well designed. 100% of the problems I had with Flutter dev, weren’t in Flutter itself. For example, sometimes I needed some magic out-of-flutter configuration to make Firebase authentication to work on iOS. Sometimes Java runtime problems would prevent the Android emulator to run. But with flutter itself, I had the best experience. It’s a god sent.