Flutter is a better product technically:
- Dart is a great language
- It compiles to native (perf)
- It's built up from a low level drawing lib (skia), meaning all the components are fully customizable. You also have access to do low level drawing (in React Native you have to go into native code or use a third part lib like react-native-svg)
- Also because of this they can translate the low level drawing commands to HTML canvas in a way that will always be more robust and complete than RN solutions
- It doesn't suffer from async issues, e.g. if you validate the value of an input (e.g. max length) there is a race condition between the user typing and the JS thread validating so the user can type more chars than intended. I've seen companies having to employ native developers to re-do controls like inputs just to be able to move validation to native code and not have that lag.
- It has better built in animations
- It has a much better development experience esp. in VSCode (great dev tools)
- You can use symlinks on NPM packages making developing a UI lib and symlinking into your project possible
- No ambiguity between choosing Expo vs RN CLI
- More officially supported plugins to do things like interfacing with the device
React Native advantages
- Familiar to web and React developers
- Easier to recruit for