System Overview

Flutter gives you one Dart framework and separate platform embedders. The shared part is real, but it stops at the boundary where the app needs device APIs, platform views, packaging, signing, or store policy.

flowchart TB
    dartApp["Dart app code"] --> framework["Flutter framework"]
    framework --> widgets["Widgets, rendering, Material, Cupertino"]
    widgets --> dartUi["dart:ui"]
    dartUi --> engine["Flutter engine"]
    engine --> embedder["Platform embedder"]
    embedder --> targets["Android, iOS, desktop, web"]
    dartApp --> packages["Packages and plugins"]
    packages --> nativeBridge["Platform channels, Pigeon, FFI, JS interop"]
    nativeBridge --> targets

Layer Map

LayerWhat it doesWhat can go wrong
Dart appScreens, state, routing, repositories, servicesToo much logic inside widgets
FrameworkWidgets, rendering, gestures, animation, Material, CupertinoRebuilds and layout costs hide until profile mode
dart:uiLow-level painting, text, semantics, input hooksUsually not where app code should start
EngineRasterization, text, platform messaging, runtime integrationRenderer and target-specific behavior differ
EmbedderAndroid/iOS/desktop/web host integrationPermissions, manifests, signing, and native views are target-specific
Plugins/platform codeDevice APIs and native librariesPlatform support may be incomplete or stale

Mental Model

Flutter rebuilds UI descriptions, not pixels directly. Your widgets describe the desired UI for the current state. The framework updates elements and render objects under the hood.

For app architecture, keep this split:

ConcernBelongs in
Layout and simple visual branchingWidgets/views
User-intent handling and UI stateView models/controllers
Persistent app dataRepositories
Network, platform, database, file, or plugin APIsServices
Target-specific codePlugin implementation or platform folders

Practical Boundary

The cleanest Flutter code still needs platform verification. A camera feature needs plugin support and permissions on Android/iOS. A desktop release needs package metadata and signing. A web app needs renderer and hosting checks. Treat those as first-class architecture, not post-build cleanup.