flutter_patcher 1.0.0 brings store-compliant hot updates to Flutter via Dart dynamic modules
Flutter teams can now hot-fix production bugs on both iOS and Android without waiting through a full release cycle, and without routing patch traffic through a third-party cloud or paying per-install fees. The trade-off is a narrow hot-update scope: anything touching native code, plugins, or FFI still requires a regular release.
Flutter's AOT compilation means a one-line bug fix still forces a full rebuild, app-store review, and user upgrade cycle that can stretch to a week. Existing workarounds are weak: custom Dart interpreters or DSL delivery restrict how you write code, and swapping .so files only works on Android while violating Google Play. Shorebird is technically strong but locked to its cloud, bills per patch install, and can fail corporate compliance checks.
flutter_patcher builds on Dart's experimental dynamic modules, embedding an interpreter in the app to load Dart bytecode at runtime. To get around the official restriction that loaded code can't override existing declarations, it renames the entire app package to patch.* and switches the startup entry to the patch's main function. The Flutter framework, SDK, and native plugins stay as machine code in the host package; only business logic and pure Dart dependencies go into the patch, so a one-line text change compiles to about 19 KB.
It's designed around store policy: bytecode runs in the app's built-in interpreter, no native executables are delivered, and any HTTPS static host (S3, R2, OSS, GCS) works for self-hosting. Patches are signed, a startup crash triggers automatic fallback to the original package, and the tool statically blocks unsupported changes like FFI calls or Flutter version upgrades. Current support is Flutter 3.47.x, Android arm64 API 28+, and iOS 13.0+.
The package-rename trick is a clean way to dodge Dart's no-override rule, but it effectively reloads all business logic under a new module path, which could complicate stack traces, analytics, or tooling that depends on package paths.
The hot-update scope is deliberately narrow: it only covers Dart-level business code and pure dependencies. Anything that touches native APIs, plugins, or FFI forces a full release, so the tool is a bug-fix mechanism, not a feature-delivery system.
Building on a precompiled engine tied to a narrow Flutter version range (3.47.x) means teams must stick to that range or wait for the project to update; that's a real maintenance burden for a library that aims to be drop-in.
Store compliance rests on the interpretation that bytecode executed by an embedded interpreter is not 'native executable code'. That line could shift if Apple or Google tighten their policies, so calling it strictly compliant is a best-effort position, not a guarantee.