KMM (Kotlin Multiplatform). It’s going very well so far. Here is the progress post.
I looked at and considered Flutter over the years but it still seemed too risky like many other cross-platform frameworks. Also I wasn’t happy about final package size which was 20-odd MB at a minimum.
Not all things are native, e.g., the UI widgets, so if Flutter hasn’t implemented a UI feature, it can be tough.
I remember for Xamarin , you would rely on them implementing support for new API’s which could be delayed.
Admittedly, Flutter has less non-native features.
I’ve use many new toys in the past that initially look great only to find that as you get deeper into the implementation, you hit a roadblock. Ionic was one such case. Any new toy is risky including Kotlin Multiplatform and Jetpack Compose, it’s just the level of risk. I classed KMM less risky than Flutter because it was all native.
Flutter was at the top of my list as a cross-platform framework.
Kotlin Multiplatform is a shared library where you can write the UI (or any other code) in the platform native code, e.g., Swift, Java or Kotlin. The expect/actual pattern also allows you to easily use platform specific features in their native form.
Not to do with risk, but another advantage is that I can reuse my Java and Kotlin code from old Flowx. In fact, I plan to use some of the reFlowx (Flowx rewrite) code into oldFlowx (the current release).
Remember G+, Hangouts, and many other abandoned projects