FlatButton onPressed打印null

时间:2019-10-24 22:31:26

标签: flutter flutter-layout

每当我使用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);
            },
          )
        ],
      ),
    ),
  ),
);
}

我不知道怎么了,请帮助我

4 个答案:

答案 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)
      }
    )