89 lines
2.9 KiB
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,
|
|
);
|
|
}
|
|
}
|