每当我使用FlatButton onPressed方法打印变量值时,它都会返回null,我也不知道为什么。当我将变量设置为静态值textField时,更改效果很好,但是FlatButton打印出静态值
Widget build(BuildContext context) {
String newTaskTitle;
return Material(
child: Container(
color: Color(0xff757575),
child: Container(
padding: EdgeInsets.all(20.0),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20.0),
topRight: Radius.circular(20.0),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text(
'Add Task',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 30.0,
color: Colors.lightBlueAccent,
),
),
TextField(
autofocus: true,
textAlign: TextAlign.center,
onChanged: (newText) {
newTaskTitle = newText;
// prints the equal value
print(newText);
},
),
FlatButton(
child: Text(
'Add',
style: TextStyle(
color: Colors.white,
),
),
color: Colors.lightBlueAccent,
onPressed: () {
print(newTaskTitle);
// Navigator.pop(context);
},
),
RaisedButton(
onPressed: () {
// prints null
print(newTaskTitle);
// Navigator.pop(context);
},
)
],
),
),
),
);
}
我不知道怎么了,请帮助我
答案 0 :(得分:0)
我认为您应该尝试将String newTaskTitle;
从构建函数中移出,然后将其设为静态属性。变成static String newTaskTitle;
答案 1 :(得分:0)
我有完全相同的问题。我只是将AddTaskScreen类更改为有状态的窗口小部件,并将newTaskTitle变量移到了build方法之外,而不是在build方法中声明了它并起作用了。 希望对别人有帮助。
答案 2 :(得分:-1)
我怀疑这一行newTaskTitle = newText;
不会重建您的页面。通过将其置于构建函数之外,尝试使其成为页面状态。
String newTaskTitle;
@override
void build(BuildContext context) {
...
尝试将其包装在setState()
中。
setState(() => newTaskTitle = newText);
答案 3 :(得分:-1)
这是因为未重建组件,所以打印的值将始终是初始值(即null),而不是您使用TextField更新的值。
您只能在Statefull组件中重新构建Build方法。您可以更改整个结构之一,也可以使用StatefullBuilder()
首先,您必须更改变量的位置:
String newTaskTitle;
Widget build(BuildContext context) {
...
}
第二,您必须使用setstate(),在这种情况下,您有两个选择:
第一个选项:
TextField(
onChanged: (newText) => setState(() => newTaskTitle = newText),
),
第二个选项:
RaisedButton(
onPressed: () {
setState(() {});
print(newTaskTitle)
}
)