通过参数传递变量以在函数内修改
pass variables by parameters to be modified within the function
我有一个方法负责将 TextFormField 字段的值保存在不同 Forms 的变量中的逻辑,但是当 Forms 被验证时,它们不会将值保存在我通过参数传递的 String 变量中。
这是我的变量声明,格式之一:
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 个具有相同代码的表单,唯一改变的是 TextFormField 的值从TextEditingController 和 controller.text 保存并保存,它告诉我它的值是 null
Dart 没有 "reference parameters" 或 "inout" 参数。参数作为值传递,因此函数无法更改该值来自的变量。
如果你需要改变一些东西,你可以创建一个包含要修改的状态的可变对象,并将其传递给函数,或者你可以确保函数可以直接看到变量(如果该函数在多个位置使用。
我有一个方法负责将 TextFormField 字段的值保存在不同 Forms 的变量中的逻辑,但是当 Forms 被验证时,它们不会将值保存在我通过参数传递的 String 变量中。
这是我的变量声明,格式之一:
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 个具有相同代码的表单,唯一改变的是 TextFormField 的值从TextEditingController 和 controller.text 保存并保存,它告诉我它的值是 null
Dart 没有 "reference parameters" 或 "inout" 参数。参数作为值传递,因此函数无法更改该值来自的变量。
如果你需要改变一些东西,你可以创建一个包含要修改的状态的可变对象,并将其传递给函数,或者你可以确保函数可以直接看到变量(如果该函数在多个位置使用。