Flutter:如何通过 AlertDialog 中的 TextFormField 更改变量?
Flutter: How to change variables through TextFormField in a AlertDialog?
我想实现一个功能如下:
有一个名为 自定义
的按钮。在此页面中,有一个名为 money
的变量。当我单击该按钮时,将出现一个带有 TextFormField 的 AlertDialog。我希望在TextFormField中输入一个数字X并点击按钮ok
退出AlertDialog后,money
将更改为X。我已经使用onSaved
来保存变量,并使用_formkey.currentState.save()
,但 money
没有改变。我的代码有什么问题?这是我的代码:
void _showMessageDialog() {
//int addMoney = 0;
showDialog(
context: context,
builder: (BuildContext context) {
// return object of type Dialog
return AlertDialog(
key: _formKey,
title: new Text('INPUT'),
content: TextFormField(
maxLines: 1,
keyboardType: TextInputType.emailAddress,
autofocus: false,
style: TextStyle(fontSize: 15),
decoration: new InputDecoration(
border: InputBorder.none,
hintText: 'input',
),
onSaved: (value) {
money = int.parse(value?.trim() ?? '0') as double;
print(money);
}
),
actions: <Widget>[
new TextButton(
key: _formKey,
child: new Text("ok"),
onPressed: () {
_formKey.currentState?.save();
Navigator.of(context).pop();
},
),
],
);
},
);
}
这里是与按钮相关的代码自定义
OutlinedButton(
style: OutlinedButton.styleFrom(
side: BorderSide(
width: 1,
color: Colors.blueAccent
)
),
onPressed: () {
// Navigator.of(context).push(
// _showMessageDialog()
// );
_showMessageDialog();
},
child: Text(
"自定义",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w700,
color: Colors.blueAccent
),
),
),
我知道我可能犯了一个大错误,但这是我的第一个 Flutter 项目。谢谢你的建议。
我会为此使用 ValueNotifier。但首先你需要添加一个 controller 到你的 TextFormField
这样你就可以让用户输入文本。
//initialize it
final myController = TextEditingController();
TextFormField(
controller: myController, //pass it to the TextFormField
),
TextButton(
child: new Text("ok"),
onPressed: () {
String input = myController.text; //this is how you get the text input
_formKey.currentState?.save();
Navigator.of(context).pop();
},
),
正如我所说,您还需要初始化 ValueNotifier 并将其传递给 _showMessageDialog
ValueNotifier<int> money = ValueNotifier(0);
_showMessageDialog(money); //and pass it to your function
void _showMessageDialog(ValueNotifier<int> money) {
TextButton(
child: new Text("ok"),
onPressed: () {
String input = myController.text; //this is how you get the text input
money.value = int.parse(input); //and then update your money variable
_formKey.currentState?.save();
Navigator.of(context).pop();
},
),
}
我想实现一个功能如下:
有一个名为 自定义
的按钮。在此页面中,有一个名为 money
的变量。当我单击该按钮时,将出现一个带有 TextFormField 的 AlertDialog。我希望在TextFormField中输入一个数字X并点击按钮ok
退出AlertDialog后,money
将更改为X。我已经使用onSaved
来保存变量,并使用_formkey.currentState.save()
,但 money
没有改变。我的代码有什么问题?这是我的代码:
void _showMessageDialog() {
//int addMoney = 0;
showDialog(
context: context,
builder: (BuildContext context) {
// return object of type Dialog
return AlertDialog(
key: _formKey,
title: new Text('INPUT'),
content: TextFormField(
maxLines: 1,
keyboardType: TextInputType.emailAddress,
autofocus: false,
style: TextStyle(fontSize: 15),
decoration: new InputDecoration(
border: InputBorder.none,
hintText: 'input',
),
onSaved: (value) {
money = int.parse(value?.trim() ?? '0') as double;
print(money);
}
),
actions: <Widget>[
new TextButton(
key: _formKey,
child: new Text("ok"),
onPressed: () {
_formKey.currentState?.save();
Navigator.of(context).pop();
},
),
],
);
},
);
}
这里是与按钮相关的代码自定义
OutlinedButton(
style: OutlinedButton.styleFrom(
side: BorderSide(
width: 1,
color: Colors.blueAccent
)
),
onPressed: () {
// Navigator.of(context).push(
// _showMessageDialog()
// );
_showMessageDialog();
},
child: Text(
"自定义",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w700,
color: Colors.blueAccent
),
),
),
我知道我可能犯了一个大错误,但这是我的第一个 Flutter 项目。谢谢你的建议。
我会为此使用 ValueNotifier。但首先你需要添加一个 controller 到你的 TextFormField
这样你就可以让用户输入文本。
//initialize it
final myController = TextEditingController();
TextFormField(
controller: myController, //pass it to the TextFormField
),
TextButton(
child: new Text("ok"),
onPressed: () {
String input = myController.text; //this is how you get the text input
_formKey.currentState?.save();
Navigator.of(context).pop();
},
),
正如我所说,您还需要初始化 ValueNotifier 并将其传递给 _showMessageDialog
ValueNotifier<int> money = ValueNotifier(0);
_showMessageDialog(money); //and pass it to your function
void _showMessageDialog(ValueNotifier<int> money) {
TextButton(
child: new Text("ok"),
onPressed: () {
String input = myController.text; //this is how you get the text input
money.value = int.parse(input); //and then update your money variable
_formKey.currentState?.save();
Navigator.of(context).pop();
},
),
}