0

这让我发疯。我正在尝试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 的地方。

关于如何解决这个问题的任何其他想法?让这样一个类工作会很棒,因为人们可以简单地频繁地重用这个类。

4

0 回答 0