您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

168 行
6.9 KiB

using System.Collections.Generic;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.service;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using TextStyle = Unity.UIWidgets.painting.TextStyle;
namespace UIWidgets.Runtime.material {
public class TextFormField : FormField<string> {
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,
bool autofocus = false,
bool obscureText = false,
bool autocorrect = true,
bool autovalidate = false,
bool maxLengthEnforced = true,
int? maxLines = 1,
int? minLines = null,
bool expands = false,
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,
strutStyle: strutStyle,
textAlign: textAlign,
textDirection: textDirection ?? TextDirection.ltr,
textCapitalization: textCapitalization,
autofocus: autofocus,
obscureText: obscureText,
autocorrect: autocorrect,
maxLengthEnforced: maxLengthEnforced,
maxLines: maxLines,
minLines: minLines,
expands: expands,
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(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(maxLength == null || maxLength > 0);
this.controller = controller;
}
public readonly TextEditingController controller;
public override State createState() {
return new _TextFormFieldState();
}
}
class _TextFormFieldState : FormFieldState<string> {
TextEditingController _controller;
public TextEditingController _effectiveController {
get { return this.widget.controller ?? this._controller; }
}
public new TextFormField widget {
get { return (TextFormField) base.widget; }
}
public override void initState() {
base.initState();
if (this.widget.controller == null) {
this._controller = new TextEditingController(text: this.widget.initialValue);
}
else {
this.widget.controller.addListener(this._handleControllerChanged);
}
}
public override void didUpdateWidget(StatefulWidget _oldWidget) {
TextFormField oldWidget = _oldWidget as TextFormField;
base.didUpdateWidget(oldWidget);
if (this.widget.controller != oldWidget.controller) {
oldWidget.controller?.removeListener(this._handleControllerChanged);
this.widget.controller?.addListener(this._handleControllerChanged);
if (oldWidget.controller != null && this.widget.controller == null) {
this._controller = TextEditingController.fromValue(oldWidget.controller.value);
}
if (this.widget.controller != null) {
this.setValue(this.widget.controller.text);
if (oldWidget.controller == null) {
this._controller = null;
}
}
}
}
public override void dispose() {
this.widget.controller?.removeListener(this._handleControllerChanged);
base.dispose();
}
public override void reset() {
base.reset();
this.setState(() => { this._effectiveController.text = (string) this.widget.initialValue; });
}
void _handleControllerChanged() {
if (this._effectiveController.text != this.value) {
this.didChange(this._effectiveController.text);
}
}
}
}