首页 > 解决方案 > Flutter SetState 不更新文本

问题描述

我有一个带有 Text 的页面,它应该显示我在TextEditingController. 我只粘贴重要的代码,如果需要更多请告诉我:

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
        child: Scaffold(
            key: _scaffoldKey,
            appBar: _buildBar(context),
            body: Container(
                child: SingleChildScrollView(
                    child: Column(
              children: <Widget>[
                Padding(
                  padding: EdgeInsets.only(top: 10),
                ),
                buildTitle(),
              ],
            )))),
        onWillPop: () => _onWillPop(context));
...
  }

buildTitle() 方法是:

Widget buildTitle() {
return Column(children: <Widget>[
  Row(
    mainAxisAlignment: MainAxisAlignment.center,
    children: <Widget>[
      Text(
        name == null ? "" : name,
        style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
      ),
      IconButton(
        icon: Icon(Icons.edit),
        onPressed: () {
          changeName();
        },
      ),
    ],
  ),
  ...
]);

}

而 changeName() 是:

void changeName() {
    showDialog(
        context: context,
        builder: (context) {
          return StatefulBuilder(builder: (context, setState) {
            return AlertDialog(
              title: Text('Name'),
              content: TextField(
                autofocus: true,
                controller: _textController,
                decoration: InputDecoration(
                  hintText: "Name of product",
                  errorText: incorrectName
                      ? 'The name could not be empty'
                      : null,
                ),
              ),
              actions: <Widget>[
                FlatButton(
                  child: new Text('OK'),
                  onPressed: () {
                    if (_textController.text.length == 0) {
                      setState(() {
                        _textController.text.length == 0
                            ? incorrectName = true
                            : incorrectName = false;
                      });
                    } else {
                      setState(() {
                        incorrectName = false;
                        name = _textController.text;
                      });
                      Navigator.of(context).pop();
                    }
                  },
                ),
                FlatButton(
                  child: new Text('Cancel'),
                  onPressed: () {
                      Navigator.of(context).pop();
                  },
                )
              ],
            );
          });
        });
  }

起初,名称是空的,所以只出现编辑按钮,但是当我点击确定时,文本不会改变,但我有其他方法使用 SetState,当我点击时,名称就会出现。

在这种情况下,为什么不使用 SetState 更新名称?

标签: androidflutterdartwidgetsetstate

解决方案


更改changeName()返回类型:

Future<String> changeName() {
    showDialog<String>(
        context: context,
        builder: (context) {
            return AlertDialog(
              title: Text('Name'),
              content: TextField(
                autofocus: true,
                controller: _textController,
                decoration: InputDecoration(
                  hintText: "Name of product",
                  errorText: incorrectName
                      ? 'The name could not be empty'
                      : null,
                ),
              ),
              actions: <Widget>[
                FlatButton(
                  child: new Text('OK'),
                  onPressed: () {
                    if (_textController.text.length == 0) {
                      Navigator.of(context).pop(null);
                    } else {
                      Navigator.of(context).pop(_textController.text);
                    }
                  },
                ),
                FlatButton(
                  child: new Text('Cancel'),
                  onPressed: () {
                      Navigator.of(context).pop(null);
                  },
                )
              ],
            );
        });
  }

在你的buildTitle()

Widget buildTitle() {
return Column(children: <Widget>[
  Row(
    mainAxisAlignment: MainAxisAlignment.center,
    children: <Widget>[
      Text(
        name == null ? "" : name,
        style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
      ),
      IconButton(
        icon: Icon(Icons.edit),
        onPressed: () async {
          name = await changeName();
          setState((){});
        },
      ),
    ],
  ),
  ...
]);

推荐阅读