From 37f025056cc642299307c048ae16870ed6e2c150 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Mon, 12 Jan 2026 11:05:57 +0100 Subject: [PATCH] fix: iPad modal auto-dismiss on iPadOS 26.1+ close #224, credits to @Jon-Salmon for the workaround: https://github.com/flutter/flutter/issues/175606#issuecomment-3453392532 --- lib/main.dart | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/main.dart b/lib/main.dart index 79ea1e19..168af9cb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/gestures.dart'; import 'dart:io' show Platform; import 'package:window_manager/window_manager.dart'; import 'package:provider/provider.dart'; @@ -39,8 +40,26 @@ import 'utils/language_codes.dart'; import 'i18n/strings.g.dart'; import 'focus/input_mode_tracker.dart'; +// Workaround for Flutter bug #177992: iPadOS 26.1+ misinterprets fake touch events +// at (0,0) as barrier taps, causing modals to dismiss immediately. +// Remove when Flutter PR #179643 is merged. +bool _zeroOffsetPointerGuardInstalled = false; + +void _installZeroOffsetPointerGuard() { + if (_zeroOffsetPointerGuardInstalled) return; + GestureBinding.instance.pointerRouter.addGlobalRoute(_absorbZeroOffsetPointerEvent); + _zeroOffsetPointerGuardInstalled = true; +} + +void _absorbZeroOffsetPointerEvent(PointerEvent event) { + if (event.position == Offset.zero) { + GestureBinding.instance.cancelPointer(event.pointer); + } +} + void main() async { WidgetsFlutterBinding.ensureInitialized(); + _installZeroOffsetPointerGuard(); // Workaround for iPadOS 26.1+ modal dismissal bug // Initialize settings first to get saved locale final settings = await SettingsService.getInstance();