import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; /// Utility class untuk memperbaiki masalah keyboard yang tertutup otomatis class KeyboardFix { /// Menerapkan fix untuk masalah keyboard di seluruh aplikasi static void applyGlobalFix() { // Nonaktifkan plugin keyboard yang mungkin menyebabkan masalah SystemChannels.textInput.invokeMethod('TextInput.hide'); // Delay sebentar untuk memastikan sistem siap Future.delayed(const Duration(milliseconds: 100), () { // Tidak ada tindakan lain, hanya memberi tahu sistem untuk reset }); } /// Membuat TextField yang tidak akan menutup keyboard secara otomatis static Widget createFixedTextField({ required TextEditingController controller, FocusNode? focusNode, String? labelText, String? hintText, TextInputType keyboardType = TextInputType.text, bool obscureText = false, int? maxLines, TextInputAction? textInputAction, void Function(String)? onSubmitted, String? Function(String?)? validator, InputDecoration? decoration, bool autofocus = false, }) { return TextFormField( controller: controller, focusNode: focusNode, decoration: decoration ?? InputDecoration( labelText: labelText, hintText: hintText, border: OutlineInputBorder(borderRadius: BorderRadius.circular(8)), ), keyboardType: keyboardType, obscureText: obscureText, maxLines: maxLines ?? 1, textInputAction: textInputAction, onFieldSubmitted: onSubmitted, validator: validator, autofocus: autofocus, // Hindari menutup keyboard saat tap di luar field enableInteractiveSelection: true, ); } /// Membungkus widget dengan GestureDetector yang tidak akan menutup keyboard static Widget wrapWithSafeGesture(Widget child) { return GestureDetector( onTap: () { // Tidak melakukan apa-apa, biarkan sistem yang menangani }, child: child, ); } /// Menampilkan bottom sheet dengan cara yang tidak akan menutup keyboard static Future showSafeModalBottomSheet({ required BuildContext context, required Widget Function(BuildContext) builder, bool isScrollControlled = true, Color? backgroundColor, bool? enableDrag, bool? isDismissible, bool? useSafeArea, BoxConstraints? constraints, }) { // Force reset input method sebelum menampilkan bottom sheet SystemChannels.textInput.invokeMethod('TextInput.clearClient'); return showModalBottomSheet( context: context, isScrollControlled: isScrollControlled, backgroundColor: backgroundColor ?? Colors.transparent, enableDrag: enableDrag ?? true, isDismissible: isDismissible ?? true, useSafeArea: useSafeArea ?? true, constraints: constraints, builder: builder, ); } }