颤振 - '初始值 == 空 ||控制器 == 空':不为 真

  • 本文关键字:控制器 不为 颤振 flutter
  • 更新时间 :
  • 英文 :


我有三个小部件,它们都在与";主";在这三个小部件中,我需要将控制器传递给按钮和TextFormField,但我不知道如何正确执行,因此此错误崩溃。我还在";主";小工具。

我试着像这样传递它控制器:用户。firstName,并将其放入具有TextFormField的小部件中,如下所示TextEditingController_controller=TextEditingController(text:controller(但错误是相同的

"主";小工具:

class _EditDataPageState extends State<EditDataPage> {
final nameController = TextEditingController();
@override
void dispose() {
nameController.dispose();
sNameController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Consumer<UserState>(
builder: (context, user, child) => SafeArea(
top: false,
left: false,
right: false,
bottom: false,
child: Form(
key: JosKeys.keyName,
child: ListView(
children: <Widget>[
Container(
//color: Colors.red,
child: CustomFormTextField(
lengthLimiit: 16,
textContoller: nameController,
initialName:
${context.select((UserState p) => p.firstName)}',
keyboadrd: TextInputType.text),
),
SaveButton(
key: JosKeys.keyName,
typeProperty: 'name',
controller: nameController,
)
],
),
),
),
);
}
}

带有TextFormField 的小工具

class _CustomFormTextFieldState extends State<CustomFormTextField> {
final String? initialName, typeValidate;
final TextInputType keyboadrd;
final TextEditingController textContoller;
final int lenghtLimit;
_CustomFormTextFieldState(this.initialName, this.typeValidate, this.keyboadrd,
this.textContoller, this.lenghtLimit);
@override
Widget build(BuildContext context) {
return TextFormField(
controller: textContoller,
inputFormatters: [LengthLimitingTextInputFormatter(lenghtLimit)],
initialValue: this.initialName,
keyboardType: keyboadrd,
validator: _validate,
style: TextStyle(
color: Colors.white, fontSize: 14.0, fontWeight: FontWeight.w500),
decoration: InputDecoration(
contentPadding: EdgeInsets.all(10.0),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(0)),
borderSide: BorderSide(color: Colors.white54)),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(0)),
borderSide: BorderSide(color: Colors.white54)),
),
);
}
}

按钮是用于保存的,我需要那里的控制器来更新数据

class SaveButton extends StatelessWidget {
//Map<String, String> saveStateForm;
final GlobalKey<FormState> key;
final String typeProperty;
final TextEditingController? controller, secondContoller;
SaveButton(
{required this.typeProperty,
required this.key,
required this.controller,
@required this.secondContoller});
@override
Widget build(BuildContext context) {
void onPress() {
if (this.key.currentState!.validate()) {
if (this.typeProperty == 'phone') {
Provider.of<UserState>(context)
.updatePhone(this.controller.toString());
} else if (this.typeProperty == 'email') {
Provider.of<UserState>(context)
.updateEmail(this.controller.toString());
} else if (this.typeProperty == 'name' ||
this.typeProperty == 'sName') {
Provider.of<UserState>(context)
.updateFirstName(this.controller.toString());
if (secondContoller != null) {
Provider.of<UserState>(context)
.updateSname(this.controller.toString());
}
} else
print('TYPEPROPERTY ERROR');
}
}

不能同时使用initialValue和控制器。所以,更好的方法是使用控制器,因为它的构造函数确实为您提供了可以设置的初始值。

下面是一个例子。

// In class level 
final controller = TextEditingController(text: "Your initial value");
Widget build(BuildContext context) {
return TextFormField(
controller: controller, 
// ...
);
}

为了跟踪用户输入的值,您可以使用

controller.text

最新更新