如果我在文本表单字段中创建了一个初始值,我将尝试设置一个初始值。当我运行代码时:
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()方法有问题,但是它确实返回了字符串。
答案 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 中使用初始值设置控制器。