# Impeller Map Rendering Issue Documentation
## Issue Overview
The Plan B Logistics Flutter app experiences map rendering glitches when using Flutter's Impeller rendering engine on Android. This requires the app to run with the `--no-enable-impeller` flag to function correctly.
## Affected Components
- **Component**: Google Maps Navigation SDK for Flutter
- **Platform**: Android (device: KM10 - Android physical device)
- **Rendering Engine**: Impeller (Flutter's new rendering backend)
- **Symptoms**: Visual glitches and rendering artifacts on the map view
## Technical Background
### What is Impeller?
Impeller is Flutter's next-generation rendering engine designed to replace the Skia backend. It provides:
- Predictable performance by precompiling shaders
- Reduced jank and frame drops
- Better graphics API utilization (Metal on iOS, Vulkan on Android)
However, Impeller is still being stabilized and some third-party plugins (particularly those with native platform views) may experience compatibility issues.
### Why Google Maps Has Issues with Impeller
Google Maps Navigation SDK uses native platform views (SurfaceView on Android) that render the map content. The interaction between:
1. Flutter's rendering pipeline (Impeller)
2. Native Android views (Platform Views)
3. Complex map rendering (Google Maps SDK)
Can cause rendering glitches, z-index issues, or visual artifacts.
## Current Workaround
### Running with Impeller Disabled
**Command:**
```bash
flutter run -d KM10 --no-enable-impeller
```
**Effect:** Forces Flutter to use the legacy Skia rendering backend instead of Impeller.
### Deprecation Warning
When running with `--no-enable-impeller`, Flutter displays the following warning:
```
[IMPORTANT:flutter/shell/common/shell.cc(527)] [Action Required]: Impeller opt-out deprecated.
The application opted out of Impeller by either using the
`--no-enable-impeller` flag or the
`io.flutter.embedding.android.EnableImpeller` `AndroidManifest.xml` entry.
These options are going to go away in an upcoming Flutter release. Remove
the explicit opt-out. If you need to opt-out, please report a bug describing
the issue.
```
**Important:** This flag will be removed in a future Flutter release, meaning this workaround is temporary.
## Observed Symptoms (When Impeller is Enabled)
When running with Impeller enabled (default behavior), the following issues occur:
1. **Map Rendering Glitches**
- Visual artifacts on the map surface
- Possible z-index layering issues between Flutter widgets and native map view
- Inconsistent rendering of map tiles or navigation elements
2. **Performance Issues**
- Frame skipping: "Skipped 128 frames! The application may be doing too much work on its main thread"
- Possible GPU rendering conflicts between Impeller and Google Maps' native rendering
3. **Platform View Integration Issues**
- The map uses a SurfaceView (native Android view) embedded in Flutter's widget tree
- Impeller's composition may conflict with how Flutter manages platform views
## File References
### Map Component Implementation
**File:** `lib/components/dark_mode_map.dart`
- Implements Google Maps Navigation SDK integration
- Uses AndroidView platform view for native map rendering
- Lines 403-408, 421-426: Auto-recenter functionality
- Configures map settings for performance optimization
**Key Code Sections:**
```dart
// Platform view creation (Android)
body: Platform.isAndroid
? AndroidView(
viewType: 'google_navigation_flutter',
onPlatformViewCreated: _onViewCreated,
creationParams: _viewCreationParams,
creationParamsCodec: const StandardMessageCodec(),
)
```
## Potential Solutions
### 1. Wait for Upstream Fixes (Recommended)
**Action:** Monitor the following repositories for updates:
- [Flutter Engine Issues](https://github.com/flutter/flutter/issues)
- [Google Maps Flutter Navigation Plugin](https://github.com/googlemaps/flutter-navigation-sdk/issues)
**Search Terms:**
- "Impeller platform view glitch"
- "Google Maps Impeller rendering"
- "AndroidView Impeller artifacts"
### 2. Report Issue to Flutter Team
If not already reported, file a bug report with:
- Device: KM10 Android device
- Flutter version: (check with `flutter --version`)
- Google Maps Navigation SDK version
- Detailed reproduction steps
- Screenshots/video of the glitch
**Report at:** https://github.com/flutter/flutter/issues/new?template=02_bug.yml
### 3. Permanent AndroidManifest Configuration (Temporary)
If needed for production builds before Flutter removes the flag, add to `android/app/src/main/AndroidManifest.xml`:
```xml
```
**Warning:** This will also be deprecated and removed in future Flutter releases.
### 4. Investigate Hybrid Composition (Alternative)
Try switching to Hybrid Composition mode for platform views:
```dart
// In android/app/src/main/AndroidManifest.xml
```
This changes how Flutter composites native views and may resolve rendering conflicts with Impeller.
### 5. Monitor Flutter Stable Channel Updates
As Flutter's Impeller implementation matures, future stable releases will include fixes for platform view rendering issues. Regularly update Flutter and test with Impeller enabled:
```bash
flutter upgrade
flutter run -d KM10 # Test without --no-enable-impeller flag
```
## Testing Checklist
When testing Impeller compatibility in future Flutter versions:
- [ ] Map renders correctly without visual artifacts
- [ ] Delivery list sidebar doesn't interfere with map rendering
- [ ] Map markers and navigation UI elements display properly
- [ ] No z-index issues between Flutter widgets and map view
- [ ] Smooth scrolling and panning without frame drops
- [ ] Navigation route rendering works correctly
- [ ] Camera transitions are smooth
- [ ] Auto-recenter functionality works
- [ ] Performance is acceptable (check frame timing in DevTools)
## Development Workflow
### Current Recommendation
**For Android development:**
```bash
# Use this until Impeller compatibility is confirmed
flutter run -d KM10 --no-enable-impeller
```
**For iOS development:**
```bash
# iOS Impeller is more stable, can use default
flutter run -d ios
```
### Hot Reload
Hot reload works normally with Impeller disabled:
```bash
# Press 'r' in terminal or
echo "r" | nc localhost 7182
```
### Release Builds
**Current Android release builds should also disable Impeller:**
In `android/app/build.gradle`:
```gradle
android {
defaultConfig {
// Add Impeller opt-out for release builds
manifestPlaceholders = [
enableImpeller: 'false'
]
}
}
```
Then reference in AndroidManifest.xml:
```xml
```
## Timeline and Impact
### Short-term (Current)
- **Status:** Using `--no-enable-impeller` flag for all Android development
- **Impact:** No user-facing issues, development proceeds normally
- **Risk:** None, Skia backend is stable and well-tested
### Medium-term (Next 3-6 months)
- **Status:** Monitor Flutter stable releases for Impeller improvements
- **Action:** Test each stable release with Impeller enabled
- **Risk:** Low, workaround is stable
### Long-term (6-12 months)
- **Status:** Impeller opt-out will be removed from Flutter
- **Action:** Must resolve compatibility or report blocking issues
- **Risk:** Medium - may need to migrate away from Google Maps if incompatibility persists
## Related Issues
### Performance Warnings
The following warnings appear in logs but are expected during development:
```
I/Choreographer(22365): Skipped 128 frames! The application may be doing too much work on its main thread.
```
This is related to initial app load and map initialization, not specifically to the Impeller workaround.
### Platform View Warnings
```
E/FrameEvents(22365): updateAcquireFence: Did not find frame.
W/Parcel(22365): Expecting binder but got null!
```
These warnings appear with both Skia and Impeller backends and are Android platform view quirks, not critical errors.
## References
- [Flutter Impeller Documentation](https://docs.flutter.dev/perf/impeller)
- [Flutter Platform Views](https://docs.flutter.dev/platform-integration/android/platform-views)
- [Google Maps Flutter Navigation SDK](https://developers.google.com/maps/documentation/navigation/flutter/reference)
- [Flutter Issue: Impeller platform view support](https://github.com/flutter/flutter/issues?q=is%3Aissue+impeller+platform+view)
## Last Updated
**Date:** 2025-11-25
**Flutter Version:** (Run `flutter --version` to check)
**Device:** KM10 Android
**Status:** Workaround active, monitoring for upstream fixes
---
## Notes for Future Developers
If you're reading this documentation:
1. **First, try without the flag** - Impeller may have been fixed in your Flutter version:
```bash
flutter run -d android
```
2. **If you see map glitches**, add the flag:
```bash
flutter run -d android --no-enable-impeller
```
3. **If the flag is removed and maps still glitch**, search for:
- "Flutter Impeller Google Maps" on GitHub Issues
- Alternative map solutions (Apple Maps on iOS, alternative SDKs)
- Platform view composition modes
4. **Consider this a temporary workaround**, not a permanent solution.