Flutter iOS Safari Double Selection Issue - Technical Workaround
Problem
Flutter web apps on iOS Safari exhibit a "double selection" bug where text selection creates two overlapping selection layers, causing visual artifacts and interaction issues.
Root Cause
iOS Safari creates both native browser text selection AND Flutter's custom SelectionArea selection simultaneously, resulting in conflicting selection states.
Working Workaround
HTML Solution (web/index.html)
<head>
<style>
* {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
/* Disable caret to prevent selection artifacts */
caret-color: rgba(255, 255, 255, 0) !important;
}
</style>
</head>
<body oncontextmenu="event.preventDefault();" >
...
Flutter Integration
// In main.dart or app initialization
import 'package:flutter/gestures.dart';
void main() {
// Disable browser context menu to let Flutter handle selection
if (kIsWeb) {
BrowserContextMenu.disableContextMenu();
}
runApp(MyApp());
}
How It Works
- Disables native selection - user-select: none prevents Safari's text selection
- Blocks touch events - Prevents iOS touch selection gestures
- Maintains Flutter selection - BrowserContextMenu.disableContextMenu() allows Flutter's SelectionArea to work
- Hides caret artifacts - caret-color: transparent eliminates visual glitches
Trade-offs
- ❌ Breaks native web text selection outside Flutter widgets
- ❌ May affect accessibility tools
- ✅ Provides consistent cross-platform selection behavior
- ✅ Eliminates iOS-specific double selection bug
Status
- GitHub Issue: https://github.com/flutter/flutter/issues/151479
- Priority: P2 (No official fix timeline)
- Workaround Status: Production-tested, reliable solution
This workaround is recommended for Flutter web apps requiring text selection on iOS Safari until the official framework fix is released.