In quanto sviluppatore di applicazioni ho avuto modo di usare sia linguaggi nativi (Java/Kotlin e OBJ-C/Swift) che cross-platform fra cui rientra Flutter.
La scelta di quale approccio utilizzare non è semplice perchè ci sono pro e contro in entrambe. Sicuramente scegliendo un approccio nativo impari a sviluppare applicazioni con un livello di performance migliori di un cross-platform. Inoltre potrai sempre lavorare in anteprima sulle versioni in uscita, cosa che con il cross non è possibile perchè spesso effettuano la portabilità delle API solo dopo il rilascio al pubblico.
D'altro canto ti tocca studiare due sistemi completamente diversi tra loro e metterci il doppio del tempo siccome dovrai scrivere due codici diversi. Con il cross il codice è unico, anche se altri framework diversi da Flutter richiedono la conoscenza di HTML e CSS per fare la parte grafica (se li conosci bene puoi creare cose fighissime)
Se sei da solo a sviluppare forse ti conviene il cross per questioni di tempo. Se siete in due vi consiglio il nativo tutta la vita.
In generale la mia filosofia è: progetto piccolo va bene il cross, progetto grande e complesso vince il nativo. A casa mia le performance e la distribuzione di codice aggiornato vincono quasi sempre. Ovviamente se arriva un cliente che vuole spendere poco la scelta ricade sul cross, poi sono cazzi suoi se per 6 mesi non supporterà l'ultimo sistema operativo iOS e/o Android.
Sulla scelta del linguaggio nativo vai direttamente con Kotlin, lascia stare Java perchè la versione usata per Android è nettamente inferiore alla potenza e funzionalità che ti offre Kotlin. Per iOS ovviamente vai con Swift (per la precisione usa il framework SwiftUI. Lascia stare le storyboard).
Ti svelo un segreto che non molti sanno:
Kotlin e
Swift (Scade) possono essere usati anche come linguaggi cross