InputDecoration _getEffectiveDecoration()
        {
            MaterialLocalizations localizations       = MaterialLocalizations.of(this.context);
            ThemeData             themeData           = Theme.of(this.context);
            InputDecoration       effectiveDecoration = (this.widget.decoration ?? new InputDecoration())
                                                        .applyDefaults(themeData.inputDecorationTheme)
                                                        .copyWith(
                enabled: this.widget.enabled,
                hintMaxLines: this.widget.decoration?.hintMaxLines ?? this.widget.maxLines
                );

            if (effectiveDecoration.counter != null || effectiveDecoration.counterText != null)
            {
                return(effectiveDecoration);
            }

            Widget counter;
            int    currentLength = this._effectiveController.value.text.Length;

            if (effectiveDecoration.counter == null &&
                effectiveDecoration.counterText == null &&
                this.widget.buildCounter != null)
            {
                bool isFocused = this._effectiveFocusNode.hasFocus;
                counter = this.widget.buildCounter(
                    this.context,
                    currentLength: currentLength,
                    maxLength: this.widget.maxLength,
                    isFocused: isFocused
                    );
                return(effectiveDecoration.copyWith(counter: counter));
            }

            if (this.widget.maxLength == null)
            {
                return(effectiveDecoration);
            }

            string counterText = $"{currentLength}";

            if (this.widget.maxLength > 0)
            {
                counterText += $"/{this.widget.maxLength}";
                if (this._effectiveController.value.text.Length > this.widget.maxLength)
                {
                    return(effectiveDecoration.copyWith(
                               errorText: effectiveDecoration.errorText ?? "",
                               counterStyle: effectiveDecoration.errorStyle
                               ?? themeData.textTheme.caption.copyWith(color: themeData.errorColor),
                               counterText: counterText
                               ));
                }
            }

            // Handle length exceeds maxLength

            return(effectiveDecoration.copyWith(
                       counterText: counterText
                       ));
        }
 public DropdownButtonFormField(
     Key key = null,
     T value = null,
     List <DropdownMenuItem <T> > items = null,
     ValueChanged <T> onChanged         = null,
     InputDecoration decoration         = null,
     FormFieldSetter <T> onSaved        = null,
     FormFieldValidator <T> validator   = null,
     Widget hint = null
     ) : base(
         key: key,
         onSaved: onSaved,
         initialValue: value,
         validator: validator,
         builder: (FormFieldState <T> field) => {
     InputDecoration effectiveDecoration = (decoration ?? new InputDecoration())
                                           .applyDefaults(Theme.of(field.context).inputDecorationTheme);
     return(new InputDecorator(
                decoration: effectiveDecoration.copyWith(errorText: field.errorText),
                isEmpty: value == null,
                child: new DropdownButtonHideUnderline(
                    child: new DropdownButton <T>(
                        isDense: true,
                        value: value,
                        items: items,
                        hint: hint,
                        onChanged: field.didChange
                        )
                    )
                ));
 }
         ) {
     this.onChanged = onChanged;
 }
        InputDecoration _getEffectiveDecoration()
        {
            MaterialLocalizations localizations       = MaterialLocalizations.of(this.context);
            InputDecoration       effectiveDecoration = (this.widget.decoration ?? new InputDecoration())
                                                        .applyDefaults(Theme.of(this.context).inputDecorationTheme)
                                                        .copyWith(
                enabled: this.widget.enabled
                );

            if (!this.needsCounter)
            {
                return(effectiveDecoration);
            }

            int    currentLength = this._effectiveController.value.text.Length;
            string counterText   = $"{currentLength}";


            if (this.widget.maxLength != TextField.noMaxLength)
            {
                counterText += $"/{this.widget.maxLength}";
            }

            // Handle length exceeds maxLength
            if (this._effectiveController.value.text.Length > this.widget.maxLength)
            {
                ThemeData themeData = Theme.of(this.context);
                return(effectiveDecoration.copyWith(
                           errorText: effectiveDecoration.errorText ?? "",
                           counterStyle: effectiveDecoration.errorStyle
                           ?? themeData.textTheme.caption.copyWith(color: themeData.errorColor),
                           counterText: counterText
                           ));
            }

            return(effectiveDecoration.copyWith(
                       counterText: counterText
                       ));
        }
 public TextFormField(
     Key key = null,
     TextEditingController controller = null,
     string initialValue                   = null,
     FocusNode focusNode                   = null,
     InputDecoration decoration            = null,
     TextInputType keyboardType            = null,
     TextCapitalization textCapitalization = TextCapitalization.none,
     TextInputAction?textInputAction       = null,
     TextStyle style             = null,
     TextDirection?textDirection = null,
     TextAlign textAlign         = TextAlign.left,
     bool autofocus                            = false,
     bool obscureText                          = false,
     bool autocorrect                          = true,
     bool autovalidate                         = false,
     bool maxLengthEnforced                    = true,
     int maxLines                              = 1,
     int?maxLength                             = null,
     VoidCallback onEditingComplete            = null,
     ValueChanged <string> onFieldSubmitted    = null,
     FormFieldSetter <string> onSaved          = null,
     FormFieldValidator <string> validator     = null,
     List <TextInputFormatter> inputFormatters = null,
     bool enabled                              = true,
     float cursorWidth                         = 2.0f,
     Radius cursorRadius                       = null,
     Color cursorColor                         = null,
     Brightness?keyboardAppearance             = null,
     EdgeInsets scrollPadding                  = null,
     bool enableInteractiveSelection           = true,
     InputCounterWidgetBuilder buildCounter    = null
     ) : base(
         key: key,
         initialValue: controller != null ? controller.text : (initialValue ?? ""),
         onSaved: onSaved,
         validator: validator,
         autovalidate: autovalidate,
         enabled: enabled,
         builder: (FormFieldState <string> field) => {
     _TextFormFieldState state           = (_TextFormFieldState)field;
     InputDecoration effectiveDecoration = (decoration ?? new InputDecoration())
                                           .applyDefaults(Theme.of(field.context).inputDecorationTheme);
     return(new TextField(
                controller: state._effectiveController,
                focusNode: focusNode,
                decoration: effectiveDecoration.copyWith(errorText: field.errorText),
                keyboardType: keyboardType,
                textInputAction: textInputAction,
                style: style,
                textAlign: textAlign,
                textDirection: textDirection ?? TextDirection.ltr,
                textCapitalization: textCapitalization,
                autofocus: autofocus,
                obscureText: obscureText,
                autocorrect: autocorrect,
                maxLengthEnforced: maxLengthEnforced,
                maxLines: maxLines,
                maxLength: maxLength,
                onChanged: field.didChange,
                onEditingComplete: onEditingComplete,
                onSubmitted: onFieldSubmitted,
                inputFormatters: inputFormatters,
                enabled: enabled,
                cursorWidth: cursorWidth,
                cursorRadius: cursorRadius,
                cursorColor: cursorColor,
                scrollPadding: scrollPadding ?? EdgeInsets.all(20.0f),
                keyboardAppearance: keyboardAppearance,
                enableInteractiveSelection: enableInteractiveSelection,
                buildCounter: buildCounter
                ));
 }
         ) {
     D.assert(initialValue == null || controller == null);
     D.assert(maxLines > 0);
     D.assert(maxLength == null || maxLength > 0);
     this.controller = controller;
 }
Exemple #5
0
        public TextFormField(
            Key key = null,
            TextEditingController controller = null,
            string initialValue                   = null,
            FocusNode focusNode                   = null,
            InputDecoration decoration            = null,
            TextInputType keyboardType            = null,
            TextCapitalization textCapitalization = TextCapitalization.none,
            TextInputAction?textInputAction       = null,
            TextStyle style                     = null,
            StrutStyle strutStyle               = null,
            TextDirection?textDirection         = null,
            TextAlign textAlign                 = TextAlign.left,
            TextAlignVertical textAlignVertical = null,
            bool autofocus = false,
            bool readOnly  = false,
            ToolbarOptions toolbarOptions = null,
            bool?showCursor  = null,
            bool obscureText = false,
            bool autocorrect = true,
            SmartDashesType?smartDashesType = null,
            SmartQuotesType?smartQuotesType = null,
            bool enableSuggestions          = true,
            bool autovalidate                         = false,
            bool maxLengthEnforced                    = true,
            int?maxLines                              = 1,
            int?minLines                              = null,
            bool expands                              = false,
            int?maxLength                             = null,
            ValueChanged <string> onChanged           = null,
            GestureTapCallback onTap                  = null,
            VoidCallback onEditingComplete            = null,
            ValueChanged <string> onFieldSubmitted    = null,
            FormFieldSetter <string> onSaved          = null,
            FormFieldValidator <string> validator     = null,
            List <TextInputFormatter> inputFormatters = null,
            bool enabled                              = true,
            float cursorWidth                         = 2.0f,
            Radius cursorRadius                       = null,
            Color cursorColor                         = null,
            Brightness?keyboardAppearance             = null,
            EdgeInsets scrollPadding                  = null,
            bool enableInteractiveSelection           = true,
            InputCounterWidgetBuilder buildCounter    = null,
            ScrollPhysics scrollPhysics               = null
            ) : base(
                key: key,
                initialValue: controller != null ? controller.text : (initialValue ?? ""),
                onSaved: onSaved,
                validator: validator,
                autovalidate: autovalidate,
                enabled: enabled,
                builder: (FormFieldState <string> field) => {
            _TextFormFieldState state           = (_TextFormFieldState)field;
            InputDecoration effectiveDecoration = (decoration ?? new InputDecoration())
                                                  .applyDefaults(Theme.of(field.context).inputDecorationTheme);

            void onChangedHandler(string value)
            {
                if (onChanged != null)
                {
                    onChanged(value);
                }

                field.didChange(value);
            }

            return(new TextField(
                       controller: state._effectiveController,
                       focusNode: focusNode,
                       decoration: effectiveDecoration.copyWith(errorText: field.errorText),
                       keyboardType: keyboardType,
                       textInputAction: textInputAction,
                       style: style,
                       strutStyle: strutStyle,
                       textAlign: textAlign,
                       textAlignVertical: textAlignVertical,
                       textDirection: textDirection ?? TextDirection.ltr,
                       textCapitalization: textCapitalization,
                       autofocus: autofocus,
                       toolbarOptions: toolbarOptions,
                       readOnly: readOnly,
                       showCursor: showCursor,
                       obscureText: obscureText,
                       autocorrect: autocorrect,
                       smartDashesType: smartDashesType ??
                       (obscureText ? SmartDashesType.disabled : SmartDashesType.enabled),
                       smartQuotesType: smartQuotesType ??
                       (obscureText ? SmartQuotesType.disabled : SmartQuotesType.enabled),
                       enableSuggestions: enableSuggestions,
                       maxLengthEnforced: maxLengthEnforced,
                       maxLines: maxLines,
                       minLines: minLines,
                       expands: expands,
                       maxLength: maxLength,
                       onChanged: onChangedHandler,
                       onTap: onTap,
                       onEditingComplete: onEditingComplete,
                       onSubmitted: onFieldSubmitted,
                       inputFormatters: inputFormatters,
                       enabled: enabled,
                       cursorWidth: cursorWidth,
                       cursorRadius: cursorRadius,
                       cursorColor: cursorColor,
                       scrollPadding: scrollPadding ?? EdgeInsets.all(20.0f),
                       scrollPhysics: scrollPhysics,
                       keyboardAppearance: keyboardAppearance,
                       enableInteractiveSelection: enableInteractiveSelection,
                       buildCounter: buildCounter
                       ));
        }
                ) {
            D.assert(initialValue == null || controller == null);
            D.assert(maxLines > 0);
            D.assert(maxLines == null || maxLines > 0);
            D.assert(minLines == null || minLines > 0);
            D.assert((maxLines == null) || (minLines == null) || (maxLines >= minLines),
                     () => "minLines can't be greater than maxLines");
            D.assert(!expands || (maxLines == null && minLines == null),
                     () => "minLines and maxLines must be null when expands is true.");
            D.assert(!obscureText || maxLines == 1, () => "Obscured fields cannot be multiline.");
            D.assert(maxLength == null || maxLength > 0);
            this.controller = controller;
        }