123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /*
- * @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<String> {
- 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<String>? onChanged,
- GestureTapCallback? onTap,
- VoidCallback? onEditingComplete,
- ValueChanged<String>? onFieldSubmitted,
- FormFieldSetter<String>? onSaved,
- FormFieldValidator<String>? validator,
- List<TextInputFormatter>? 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<String>? 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<String> 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<String> {
- 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);
- }
- }
|