I know the title suggests cross-platform frameworks, but let me give my opinion: go native. For Android, Kotlin + Jetpack Compose. For iOS, Swift + SwiftUI.
Now let me elaborate on my opinion: Cross-platform doesn't work well across devices types. A desktop screen is fundamentally different from a phone screen (one is a big screen controlled with mouse + keyboard, the other is touch on a small screen). All the cross-platform apps I have seen trying to get both Desktop and Mobile are weird in some way: it's just the worst of both worlds.
Now let's say you only want to target Mobile. Then suddenly it's "some cross-platform framework" vs "2 native apps (iOS + Android)". It may seem like cross-platform means "write once", which would be half the time of writing two apps. But that's not the case. Cross-platform is more "write once, debug everywhere". And debugging is not fun, the fun part is to write the app. Kotlin and Jetpack Compose are super cool, Swift and SwiftUI too. Just choose one, and then if your app needs it, learn the other.
Here are a few problems that I have seen with cross-platform frameworks for mobile dev:
- There are huge communities for Android and iOS. Much better than any cross-platform framework. So you are more likely to get help there. - Cross-platform is annoying: develop for Android, then test on iOS and find bugs. Fix them, test on Android and find that your fixes just broke Android. Fix that, and go back testing for iOS. - Cross-platform is a tradeoff: either you have to use what's exactly common between Android/iOS, or you have to do some kind of `if (android) elseif (iOS)` (which sucks). - With cross-platform, as soon as you do something that is not just showing an image and a text, you will hit differences between the platforms: the UI is different between Android and iOS, which one do you want to choose? Permissions work differently. The filesystem works differently. WiFi, Bluetooth, all that. Wanna have a database? You'll quickly need to learn how it works on both platforms. Preferences? Same thing.
In my experience, Flutter is the nicest cross-platform framework I have used. However it's not as nice as native (smaller community, they regularly break the conventions/API (we are at Flutter v3, right?)). Also with Flutter you quickly end up writing plugins where you write your code twice (Android + iOS) and interface it in Dart. So instead of Kotlin + Swift, you now have Kotlin, Swift and Dart, which is not better. Also I am convinced that Flutter will always be a second-class citizen on iOS. If you want to try Flutter, don't do it on Android (because of course that will work better there). Try it on iOS, and see if it is bearable. I found it painful.
As for the web frameworks... IMHO web development should stick to websites :-). Let's write proper Desktop and Mobile apps for Desktop and Mobile, and keep web development for websites.
Conclusion: unless your app is super, super simple, you will be better off with native Android/iOS. And if your app is super, super simple, that's a reason to go native Android/iOS, because that's a simple app to get started!