我有一个方法负责将 TextFormField 字段的值保存在不同 Forms 的变量中,但它们不会将值保存在当验证表单时,我通过参数传递的字符串变量。
这是我的变量的一种形式的声明:
final formKeyMotherboard = new GlobalKey<FormState>();
String _numInvMotherboard,
_marcaMotherboard,
_modeloMotherboard,
_tipoMotherboard,
_detallesMotherboard,
_fechaMotherboard;
final TextEditingController controllerNumInventarioMotherboard =
new TextEditingController();
final TextEditingController controllerMarcaMotherboard =
new TextEditingController();
final TextEditingController controllerModeloMotherboard =
new TextEditingController();
final TextEditingController controllerTipoMotherboard =
new TextEditingController();
final TextEditingController controllerDetallesMotherboard =
new TextEditingController();
final TextEditingController controllerFechaMotherboard =
new TextEditingController();
方法是这样的:
Step _defaulFrom(
{@required IconData icon,
@required String nameForm,
@required Key keyForm,
@required String saveNumInv,
@required String saveMarca,
@required String saveModelo,
@required String saveTipo,
@required String saveDetalles,
@required String saveFecha,
@required TextEditingController controllerNumInv,
@required TextEditingController controllerMarca,
@required TextEditingController controllerModelo,
@required TextEditingController controllerTipo,
@required TextEditingController controllerDetalle,
@required TextEditingController controllerFecha,
TextEditingController controllerEncargado,
String saveEncargado}) {
return Step(
title: Text(
nameForm,
style: TextStyle(
color: Colors.black45,
fontSize: 22.0,
fontWeight: FontWeight.bold,
),
),
content: Form(
key: keyForm,
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: TextFormField(
controller: controllerNumInv,
autocorrect: false,
decoration: _defaulImputDecoration(NUM_INVENTARIO, icon),
validator: (val) =>
val.isEmpty ? ERROR_RELLENE_CAMPO : null,
`enter code here`onSaved: (value) => saveNumInv = value,
keyboardType: TextInputType.numberWithOptions(),
),
),
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: TextFormField(
controller: controllerMarca,
autocorrect: false,
decoration: _defaulImputDecoration(MARCA, icon),
validator: (val) =>
val.isEmpty ? ERROR_RELLENE_CAMPO : null,
onSaved: (value) => saveMarca = value,
),
),
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: TextFormField(
controller: controllerModelo,
autocorrect: false,
decoration: _defaulImputDecoration(MODELO, icon),
validator: (val) =>
val.isEmpty ? ERROR_RELLENE_CAMPO : null,
onSaved: (value) => saveModelo = value,
),
),
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: TextFormField(
controller: controllerTipo,
autocorrect: false,
decoration: _defaulImputDecoration(TIPO, icon),
validator: (val) =>
val.isEmpty ? ERROR_RELLENE_CAMPO : null,
onSaved: (value) => saveTipo = value,
),
),
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: TextFormField(
controller: controllerDetalle,
autocorrect: false,
decoration: _defaulImputDecoration(DETALLES, icon),
validator: (val) =>
val.isEmpty ? ERROR_RELLENE_CAMPO : null,
onSaved: (value) => saveDetalles = value,
),
),
controllerEncargado != null
? Padding(
padding: const EdgeInsets.only(top: 8.0),
child: TextFormField(
controller: controllerEncargado,
autocorrect: false,
decoration: _defaulImputDecoration(
NOMBRE_ENCARGADO, Icons.person),
validator: (val) =>
val.isEmpty ? ERROR_RELLENE_CAMPO : null,
onSaved: (value) => saveEncargado = value,
),
)
: Divider(
color: Colors.transparent,
),
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: TextFormField(
autocorrect: false,
controller: controllerFecha,
decoration: InputDecoration(
suffixIcon: IconButton(
icon: Icon(Icons.date_range),
onPressed: () {
_selectDate(context);
setState(() {
//_saveDate = new DateFormat.yMd(_dateTime)
});
}),
contentPadding: EdgeInsets.all(16.0),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(25.0),
),
labelText: 'Fecha',
labelStyle: TextStyle(
color: Colors.black54,
fontSize: 16.0,
decorationStyle: TextDecorationStyle.wavy),
),
validator: (val) =>
val.isEmpty ? ERROR_RELLENE_CAMPO : null,
onSaved: (value) => saveFecha = value,
),
),
}
})
],
),
)));
}
通过这种方法,我想减少代码,我有 5 个具有相同代码的表单,唯一改变的是从 TextEditingController 获取的 TextFormField 的值 和 controller.text 保存并保存,它告诉我它的值为 null
最佳答案
Dart 没有“引用参数”或“inout”参数。参数作为值传递,因此函数无法更改该值所来自的变量。
如果您需要更改某些内容,您可以创建一个包含要修改的状态的可变对象,并将其传递给函数,或者您可以确保函数可以直接看到变量(如果函数从多个位置使用)。
关于dart - 通过参数传递要在函数内修改的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53823624/