/* * @Author: XianKaiQun * @Date: 2020-08-24 15:39:09 * @LastEditors : WuWei * @LastEditTime : 2023-05-25 15:51:14 * @Description: */ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:wisdom_cli/wisdom_cli.dart'; ///与[TextFormField]几乎一致, ///差距在于这里使用[field]进行绑定, ///[field]为[WForm.initialValues]的[Map.key] /// class WTextFormField extends WFormField { WTextFormField({ Key? key, this.controller, required String field, FocusNode? focusNode, InputDecoration? decoration = const InputDecoration(), TextInputType? keyboardType, TextCapitalization textCapitalization = TextCapitalization.none, TextInputAction? textInputAction, TextStyle? style, StrutStyle? strutStyle, TextDirection? textDirection, TextAlign textAlign = TextAlign.start, TextAlignVertical? textAlignVertical, bool autofocus = false, bool readOnly = false, ToolbarOptions? toolbarOptions, bool? showCursor, String obscuringCharacter = '•', bool obscureText = false, bool autocorrect = true, SmartDashesType? smartDashesType, SmartQuotesType? smartQuotesType, bool enableSuggestions = true, AutovalidateMode? autovalidateMode, MaxLengthEnforcement maxLengthEnforcement = MaxLengthEnforcement.enforced, int maxLines = 1, int? minLines, bool expands = false, int? maxLength, ValueChanged? onChanged, GestureTapCallback? onTap, VoidCallback? onEditingComplete, ValueChanged? onFieldSubmitted, FormFieldSetter? onSaved, FormFieldValidator? validator, List? inputFormatters, bool? enabled, double cursorWidth = 2.0, Radius? cursorRadius, Color? cursorColor, Brightness? keyboardAppearance, EdgeInsets scrollPadding = const EdgeInsets.all(20.0), bool enableInteractiveSelection = true, InputCounterWidgetBuilder? buildCounter, ScrollPhysics? scrollPhysics, Iterable? autofillHints, bool showClose = true, }) : assert(controller == null), assert(minLines == null || minLines > 0), assert(!obscureText || maxLines == 1, 'Obscured fields cannot be multiline.'), assert(maxLength == null || maxLength > 0), super( key: key, field: field, onSaved: onSaved, validator: validator, autovalidateMode: autovalidateMode, enabled: enabled ?? true, builder: (WFormFieldState field) { final _WTextFormFieldState state = field as _WTextFormFieldState; var _decoration = (decoration ?? const InputDecoration()); _decoration = _decoration.applyDefaults( Theme.of(field.context).inputDecorationTheme, ); _decoration = _decoration.copyWith(errorText: field.errorText); if ((state.value ?? '') != '' && showClose == true) _decoration = _decoration.copyWith( suffix: _decoration.suffix ?? Padding( padding: EdgeInsets.only(right: 5.pt), child: WDot.delete( color: Color(0xfff2f2f2), iconTheme: IconThemeData(color: Color(0xff999999)), onTap: () => state.setValue('', rebuild: true), ), ), ); void onChangedHandler(String value) { if (onChanged != null) { onChanged(value); } field.didChange(value); } final controller = state._effectiveController!; controller.value = controller.value.copyWith(text: state.value); return TextField( controller: controller, focusNode: focusNode, decoration: _decoration, keyboardType: keyboardType, textInputAction: textInputAction, style: style, strutStyle: strutStyle, textAlign: textAlign, textAlignVertical: textAlignVertical, textDirection: textDirection, textCapitalization: textCapitalization, autofocus: autofocus, toolbarOptions: toolbarOptions, readOnly: readOnly, showCursor: showCursor, obscuringCharacter: obscuringCharacter, obscureText: obscureText, autocorrect: autocorrect, smartDashesType: smartDashesType ?? (obscureText ? SmartDashesType.disabled : SmartDashesType.enabled), smartQuotesType: smartQuotesType ?? (obscureText ? SmartQuotesType.disabled : SmartQuotesType.enabled), enableSuggestions: enableSuggestions, maxLengthEnforcement: maxLengthEnforcement, maxLines: maxLines, minLines: minLines, expands: expands, maxLength: maxLength, onChanged: onChangedHandler, onTap: onTap, onEditingComplete: onEditingComplete, onSubmitted: onFieldSubmitted, inputFormatters: inputFormatters, enabled: enabled ?? decoration?.enabled ?? true, cursorWidth: cursorWidth, cursorRadius: cursorRadius, cursorColor: cursorColor, scrollPadding: scrollPadding, scrollPhysics: scrollPhysics, keyboardAppearance: keyboardAppearance, enableInteractiveSelection: enableInteractiveSelection, buildCounter: buildCounter, autofillHints: autofillHints, ); }, ); final TextEditingController? controller; @override _WTextFormFieldState createState() => _WTextFormFieldState(); } class _WTextFormFieldState extends WFormFieldState { TextEditingController? _controller; TextEditingController? get _effectiveController => widget.controller ?? _controller; @override WTextFormField get widget => super.widget as WTextFormField; @override void initState() { super.initState(); if (widget.controller != null) { widget.controller!.addListener(_handleControllerChanged); } else { _controller = TextEditingController(); } } @override void didUpdateWidget(WTextFormField oldWidget) { super.didUpdateWidget(oldWidget); if (widget.controller != oldWidget.controller) { oldWidget.controller?.removeListener(_handleControllerChanged); widget.controller?.addListener(_handleControllerChanged); if (oldWidget.controller != null && widget.controller == null) _controller = TextEditingController.fromValue(oldWidget.controller!.value); if (widget.controller != null) { setValue(widget.controller!.text); if (oldWidget.controller == null) _controller = null; } } } @override void dispose() { widget.controller?.removeListener(_handleControllerChanged); super.dispose(); } @override void didChange(String? value) { super.didChange(value); if (_effectiveController!.text != value) _effectiveController!.text = value!; } void _handleControllerChanged() { if (_effectiveController!.text != value) didChange(_effectiveController!.text); } }