import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class TusYayilmasiEngelleWidget extends StatefulWidget { final Widget child; final bool Function(KeyEvent event) shouldBlockKey; const TusYayilmasiEngelleWidget({ super.key, required this.child, required this.shouldBlockKey, }); @override _TusYayilmasiEngelleWidgetState createState() => _TusYayilmasiEngelleWidgetState(); } class _TusYayilmasiEngelleWidgetState extends State with WidgetsBindingObserver { final FocusNode _focusNode = FocusNode(); bool _isFocused = false; int? _lastEventHash; int _lastBackPressTime = 0; // Son geri tuşu zamanı @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); _forceFocus(); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); _focusNode.dispose(); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed) { Future.delayed(const Duration(milliseconds: 0), _forceFocus); } } void _forceFocus() { WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted || _focusNode.hasFocus) return; FocusScope.of(context).unfocus(); _focusNode.requestFocus(); _isFocused = true; }); } KeyEventResult _handleKeyEvent(FocusNode node, KeyEvent event) { if (event is! KeyDownEvent) return KeyEventResult.ignored; // Sadece KeyDown işleyelim int eventHash = event.hashCode; if (_lastEventHash == eventHash) { return KeyEventResult.handled; // Aynı olay tekrar işlenmesin } _lastEventHash = eventHash; // Eğer geri tuşuna basılmışsa ve çok kısa süre içinde tekrar edilirse engelle if (event.logicalKey == LogicalKeyboardKey.escape || event.logicalKey == LogicalKeyboardKey.goBack) { int now = DateTime.now().millisecondsSinceEpoch; if (now - _lastBackPressTime < 500) { return KeyEventResult.handled; // Çift basılmasını önlüyoruz } _lastBackPressTime = now; } if (widget.shouldBlockKey(event)) { return KeyEventResult.handled; } return KeyEventResult.ignored; } @override Widget build(BuildContext context) { return GestureDetector( onTap: _forceFocus, child: Focus( focusNode: _focusNode, autofocus: true, canRequestFocus: true, skipTraversal: true, onFocusChange: (value) => _isFocused = value, onKeyEvent: _handleKeyEvent, child: widget.child, ), ); } }