Flutter TextFormField初始值不起作用

时间:2020-03-01 19:43:48

标签: flutter dart

如果我在文本表单字段中创建了一个初始值,我将尝试设置一个初始值。当我运行代码时:

final apiField = TextFormField(
  controller: apiFieldController,
  initialValue: _read().toString(),
  obscureText: true,
  style: style,
  decoration: InputDecoration(
      contentPadding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
      hintText: "API Key",
      border:
          OutlineInputBorder(borderRadius: BorderRadius.circular(32.0))),
);

_read() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
//Return String
String stringValue = prefs.getString('apiKey') ?? '';
return stringValue;
}

我收到以下错误:

package:flutter/src/material/text_form_field.dart: failed assertion. initial value == null || controller == null is not true

我不确定我被困在哪里。我确实看到控制器正在初始化。我相信_read()方法有问题,但是它确实返回了字符串。

4 个答案:

答案 0 :(得分:1)

可能是因为您设置了控制器和初始值。您只需设置这些属性之一。或初始值或控制器。

答案 1 :(得分:0)

您的read()返回Future<string>而不是字符串。 您需要使用initial value方法将setState直接设置为 控制器

我也建议您将静态分析安装到您的项目中,以避免此类问题 https://dart.dev/guides/language/analysis-options

答案 2 :(得分:0)

var _formKey = GlobalKey<FormState>();
Map<String, String> map = {
    'Name': '',
};

内部 小部件构建(BuildContext context)

 Form(
  key: _formKey,
  child: Column(
    children: <Widget>[
      TextFormField(
        key: map['Name'].isEmpty
          ? Key('Name')
          : Key(map['Name']),
        initialValue: map['Name'],
        onSaved: (value) {
          map['Name'] = value.trim();
        },
      ),
    ],
  ),
),

答案 3 :(得分:0)

您可以在 TextFormField 中建立初始值:

TextFormField(
  initialValue: "Initial String",

或者您可以使用 TextEditingController 建立它:

TextEditingController(text:"Initial String");

但是你不能两者都做,那会导致字段断言错误:

Failed assertion: line 196 pos 15: 'initialValue == null || controller == null': is not true.

我更喜欢在保存表单的小部件的 initState 中使用初始值设置控制器。