How do you temporarily switch a Flutter app off Impeller to check a rendering bug, and why is that only a short-term measure?
answer
- flutter run --no-enable-impeller
- Android manifest EnableImpeller false
- iOS cannot opt out
- desktop opt-out slated for removal
- file an [Impeller] issue
basics
~20 sUse flutter run --no-enable-impeller for a debug session, or the per-platform build switch such as Android's EnableImpeller manifest entry. iOS has no opt-out and the others are slated for removal, so the switch only isolates the bug.
solid answer
~30 sSwitching renderers is a way to prove whether a glitch is Impeller-specific. For a debug run, `flutter run --no-enable-impeller` works on Android and desktop. For a built app: on **Android**, add `<meta-data android:name="io.flutter.embedding.android.EnableImpeller" android:value="false" />` under `<application>`; on **macOS**, set `FLTEnableImpeller` to `false` in `Info.plist`; on **Linux**, call `fl_dart_project_set_enable_impeller(project, FALSE)` in the runner; on **Windows**, `project.set_impeller_switch(flutter::ImpellerSwitch::Disabled)` in `main.cpp`. **iOS cannot opt out**: Impeller is the only renderer. It is short-term because the legacy renderer brings back runtime shader-compilation jank, the docs say the opt-outs will be removed, and the right outcome is a reduced repro filed with an `[Impeller]` title prefix.
code
bash · 1 lineflutter run --no-enable-impellergo deeper
Recall that flutter run --no-enable-impeller exists for debugging, and that iOS cannot turn Impeller off.
Know the per-platform build switches and the Android backend override, and what each tells you about a rendering bug.
Use the switch to isolate, then report with a minimal repro and ship a code workaround instead of the opt-out, planning for its removal.
Set a policy that renderer opt-outs need a linked issue and an expiry, and budget time for desktop differences now that Impeller is the default there.
## Why you would switch renderers at all When a Flutter screen draws something wrong (a missing blur, a clip with jagged edges, a gradient with banding, a custom shader that looks different) the first question is whether it is **your code** or **the renderer**. If the same build looks correct with the legacy renderer and wrong with Impeller, you have an Impeller-specific issue to report, and a candidate workaround while it is fixed. If it looks wrong with both, the bug is in your drawing code. ## How to switch, per platform | Platform | During development | In a built app | |---|---|---| | iOS | not possible | not possible: Impeller is the only renderer | | Android | `flutter run --no-enable-impeller` | `io.flutter.embedding.android.EnableImpeller` = `false` in `AndroidManifest.xml` | | macOS | `flutter run --no-enable-impeller` | `FLTEnableImpeller` = `false` in `Info.plist` | | Linux | `flutter run --no-enable-impeller` | `fl_dart_project_set_enable_impeller(project, FALSE)` in `linux/runner/my_application.cc` | | Windows | `flutter run --no-enable-impeller` | `project.set_impeller_switch(flutter::ImpellerSwitch::Disabled)` in `windows/runner/main.cpp` | `--no-enable-impeller` is the negated form of the `flutter` tool's boolean `--enable-impeller` flag. Note that the flag's own help text, shown only with verbose help, still describes an older state in which Android was not Impeller by default; the platform docs are the current reference. ## Checking a backend instead of the renderer On Android, a glitch may be specific to one Impeller **backend**. In debug and profile builds, a manifest entry `io.flutter.embedding.android.ImpellerBackend` with the value `opengles` forces Impeller's OpenGL ES backend instead of Vulkan. That separates "Impeller bug" from "Vulkan driver bug" without leaving Impeller. It does nothing in release builds. ## Why it is only a short-term measure 1. **It brings back the problem Impeller solved.** The legacy renderer compiles shaders at runtime, so disabling Impeller reintroduces first-run animation jank for every user of that build. 2. **It will stop working.** The docs state that on macOS, Windows and Linux the ability to opt out will be removed in a future release, and the Android docs warn the same. iOS already removed it. 3. **It splits your test matrix.** A build with Impeller disabled behaves differently from the default everyone else ships, so fixes and performance numbers do not transfer. 4. **It hides the bug from the people who can fix it.** The renderer only improves if issues are reported. ## What to do with the result If the glitch disappears with the legacy renderer: - Build the **smallest reproducible case**: one widget, one effect. - **File an issue** on the Flutter tracker with the title prefixed `[Impeller]`, the device and chip, screenshots or a recording, and an exported performance trace, as the Impeller docs ask. - Look for a **workaround in your code**, such as a different way of drawing the same effect, rather than shipping the opt-out. - If you truly must ship the opt-out for one platform, record why, link the issue, and schedule its removal. ## A worked example A Windows build of an app shows a card whose rounded clip has jagged edges after upgrading to 3.47: 1. Run `flutter run --no-enable-impeller` on the same machine. The edges are smooth, so the difference is renderer-specific. 2. Reduce the screen to one `ClipRRect` around a coloured box and confirm the difference still reproduces. 3. File the issue with an `[Impeller]` title prefix, the GPU model, screenshots of both renderers and a performance trace export. 4. Meanwhile, try drawing the same shape another way in your own code (for example a decorated container with a border radius instead of a clip) and keep Impeller on. 5. Only if no workaround exists, ship the Windows opt-out with a comment linking the issue, and remove it when the fix lands. ## A note on desktop Impeller only became the default on macOS, Windows and Linux in 3.47, so desktop apps are the likeliest to meet a new Impeller difference right now. The same rules apply: switch to confirm, report, work around in code, and do not rely on the opt-out lasting.
- A glitch appears on Vulkan phones but not with --no-enable-impeller. How do you narrow it further without leaving Impeller?In a debug or profile build, add the `io.flutter.embedding.android.ImpellerBackend` manifest entry with the value `opengles`. If the glitch disappears on Impeller's OpenGL ES backend, the problem is specific to the Vulkan path or the device's Vulkan driver, which is valuable detail for the issue report.
- Why can an iOS team not use this technique?On iOS Impeller is the only supported renderer; the legacy renderer was removed and there is no switch. An iOS rendering glitch has to be isolated inside Impeller, by reducing the widget tree to a minimal repro, and reported or worked around in code.
saying these in an interview costs you the question
- You can disable Impeller on iOS with an Info.plist key.
- Shipping the Impeller opt-out has no downside for users.
- The opt-out switches will be supported indefinitely.
- --no-enable-impeller also changes release builds you distribute.
- Forcing ImpellerBackend to opengles works in release builds.