Ionic apps are built using the languages of the web: HTML, CSS, and JavaScript. Thus, if you know how to build a basic web app, you already know how to build with Ionic.
With Ionic, you can deploy a native iOS or Android app, native desktop app, or web app, all from a single, shared codebase. When running on mobile, Ionic runs inside a native container using Cordova or, more recently, Capacitor, which enable full access to any native device features or APIs. The UI of your Ionic mobile app runs in a WebView, which is effectively a headless browser that is invisible to the user. In a desktop implementation, Ionic runs inside a native desktop container like Electron, or directly in any mobile or desktop browser as a Progressive Web App.
Ionic Pros:
Code once, run everywhere*.
Angular + Typescript are very mature. React + Vue for Ionic V.4
Reactive UI.
Huge compatibility.
Lots of native plugins.
Lots of Angular packages.
Greater user base.
Mature Tooling.
Ionic Cons:
Not native. Embedded browser apps.
Less performance (Not really noticeable if your code is good).
Big learning curve if you have no web development experience.
When building for mobile, Flutter uses the Dart compiler to convert your Dart code into native machine code that will run on the device platform, along with a custom rendering engine to display your UI inside a mobile app. Flutter does not use the native UI elements, like you would find in React Native, nor does it use Web Components like Ionic. Instead, Flutter offers its own library of UI Widgets.
Flutter Pros:
Open source
Very fresh and vibrant community.
Code once, run on iOS and Android.
Native performance, Compiled into Native C
Reactive UI.
Great Tooling for both VSCode and Android Studio.
You can interact with native SDKs and use native dependencies.
Flutter Cons:
Need to learn Dart
Non mature user base
Small amount of packages
Does not support 32-bit iOS devices
Google has a bad history with product loyalty
Self-contained ecosystem from scratch