MIF_E31222656/lib/utils/keyboard_fix.dart

89 lines
2.9 KiB
Dart

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<T?> showSafeModalBottomSheet<T>({
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<T>(
context: context,
isScrollControlled: isScrollControlled,
backgroundColor: backgroundColor ?? Colors.transparent,
enableDrag: enableDrag ?? true,
isDismissible: isDismissible ?? true,
useSafeArea: useSafeArea ?? true,
constraints: constraints,
builder: builder,
);
}
}