【问题标题】:Why i gonna null of the String in Flutter?为什么我要把 Flutter 中的字符串设为空?
【发布时间】:2020-08-03 10:26:15
【问题描述】:

我对一件简单的事情有疑问,但我不知道它是如何在代码中发生的。 下面是代码:

  Widget build(BuildContext context) {
    String newTaskTitle;
    return 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;
              },
            ),
            FlatButton(
              child: Text(
                'Add',
                style: TextStyle(
                  color: Colors.white,
                ),
              ),
              color: Colors.lightBlueAccent,
              onPressed: () {
                print(newTaskTitle);
              },
            ),
          ],
        ),
      ),
    );
  }

我尝试获取文本字段输入的值并将其传递到另一个屏幕,但是当我键入内容然后按下按钮时,它给了我空值。

【问题讨论】:

  • 您是否在另一棵树中使用widget tree
  • 我将此屏幕放在底部弹出屏幕中。
  • 请发布您在哪里使用此widget tree 的完整代码 sn-p,以便我可以帮助解决它的问题。

标签: android flutter dart mobile


【解决方案1】:

您也可以使用控制器来实现此目的。只需初始化一个并在 TextField 小部件中指定控制器。要访问文本,只需执行 _controlller.text,如下所示:

  final _controller = TextEditingController();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: 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(
                controller: _controller,
                autofocus: true,
                textAlign: TextAlign.center,
              ),
              FlatButton(
                child: Text(
                  'Add',
                  style: TextStyle(
                    color: Colors.white,
                  ),
                ),
                color: Colors.lightBlueAccent,
                onPressed: () {
                  print(_controller.text);
                },
              ),
            ],
          ),
        ),
      ),
    );
  }

【讨论】:

  • 谢谢,效果很好。但我没有得到我的问题,因为这是编程中的一件简单的事情。
【解决方案2】:

您已经在 build() 方法中定义了 String newTaskTitle 尝试将其从 build 方法中删除并尝试在 StatefulWidget 中定义它。

发生这种情况是因为每次更改文本时,更改方法上的 TextField 都会调用 build() 方法

【讨论】:

  • 但是除了传递文本字段的文本之外我不想要状态,它不是整个屏幕的一次吗?
  • 谢谢你,兄弟。你是对的,我必须使用有状态的小部件。
猜你喜欢
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多