import 'package:flutter/material.dart'; import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; import 'package:stackwallet/utilities/util.dart'; class HoverTextField extends StatefulWidget { const HoverTextField({ Key? key, this.controller, this.focusNode, this.readOnly = false, this.enabled, this.onTap, this.onChanged, this.onEditingComplete, this.style, this.onDone, }) : super(key: key); final TextEditingController? controller; final FocusNode? focusNode; final bool readOnly; final bool? enabled; final GestureTapCallback? onTap; final ValueChanged? onChanged; final VoidCallback? onEditingComplete; final TextStyle? style; final VoidCallback? onDone; @override State createState() => _HoverTextFieldState(); } class _HoverTextFieldState extends State { late final TextEditingController? controller; late final FocusNode? focusNode; late bool readOnly; late bool? enabled; late final GestureTapCallback? onTap; late final ValueChanged? onChanged; late final VoidCallback? onEditingComplete; late final TextStyle? style; late final VoidCallback? onDone; final InputBorder inputBorder = OutlineInputBorder( borderSide: const BorderSide( width: 0, color: Colors.transparent, ), borderRadius: BorderRadius.circular(Constants.size.circularBorderRadius), ); @override void initState() { controller = widget.controller; focusNode = widget.focusNode ?? FocusNode(); readOnly = widget.readOnly; enabled = widget.enabled; onChanged = widget.onChanged; style = widget.style; onTap = widget.onTap; onEditingComplete = widget.onEditingComplete; onDone = widget.onDone; focusNode!.addListener(() { if (!focusNode!.hasPrimaryFocus && !readOnly) { setState(() { readOnly = true; }); onDone?.call(); } }); super.initState(); } @override void dispose() { controller?.dispose(); focusNode?.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return TextField( autocorrect: !Util.isDesktop, enableSuggestions: !Util.isDesktop, controller: controller, focusNode: focusNode, readOnly: readOnly, enabled: enabled, onTap: () { setState(() { readOnly = false; }); onTap?.call(); }, onChanged: onChanged, onEditingComplete: () { setState(() { readOnly = true; }); onEditingComplete?.call(); onDone?.call(); }, style: style, decoration: InputDecoration( contentPadding: const EdgeInsets.symmetric( vertical: 4, horizontal: 12, ), border: inputBorder, focusedBorder: inputBorder, disabledBorder: inputBorder, enabledBorder: inputBorder, errorBorder: inputBorder, fillColor: readOnly ? Colors.transparent : Theme.of(context).extension()!.textFieldDefaultBG, ), ); } }