这让我发疯。我正在尝试CupertinoTextField
进入 a Form
。但无论我怎么尝试,一切都变成了死胡同。
我的案例的复杂之处在于,嵌入到Flushbar包中的表单为我的 CupertinoApp 提供了一种小吃吧。这是一个无状态的小部件;-(
return Flushbar(
backgroundColor: Common.inputBlue,
userInputForm : Form(
key: _formKey,
child: Column(
children: <Widget> [
_DelayStatusFormField(
initialValue: task.delayStatus,
onSaved: (value) => otherFormDataSubmit.delayStatus = value,
//onSaved: (value) => this.delayStatus = value,
),
CupertinoTextField(
controller: _delayTec,
onChanged: (text) {
state.didChange(text);
},
),
]),
),
);
在 onChanged 部分我打算实现一些验证,所以我需要一种重建。但是如果没有适当的状态,setState 显然是行不通的。
使用 TextFormField 看起来也有点狡猾,因为我不仅需要将其嵌入,Material(
而且还需要嵌入大量进一步的本地化小部件中。
最理想的解决方案是我尝试了几种变体的解决方案:将 CupertinoTextField 嵌入 FormField 类中
class _DelayFormField extends FormField<String> {
_DelayFormField({
FormFieldSetter<String> onSaved,
String initialValue,
bool enabled,
GlobalKey key,
}) : super(
onSaved: onSaved,
initialValue: initialValue,
key: key,
builder: (FormFieldState<String> state) {
//TextEditingController inputTec = TextEditingController(text: initialValue);
return Column(children: [
SizedBox(
width: 100, height: 30,
child: CupertinoTextField(
//controller: inputTec,
enabled: true,
onChanged: (text) {
initialValue = text;
state.didChange(text);
},
)),
]);
}
);
}
这里的问题是,我 TextEditingController 在任何重建时都重新初始化initialVale
,失去了我的输入。我通过将输入分配给 来解决这个问题initialVale
,但是光标总是设置为导致预填充的数字。所以你倒着输入数字。由于一切都在类的初始化中,我找不到在构建方法之外初始化 TextEditingController 的地方。
关于如何解决这个问题的任何其他想法?让这样一个类工作会很棒,因为人们可以简单地频繁地重用这个类。