简体   繁体   English

Flutter - StatefulBuilder - 声明 setState 未被引用

[英]Flutter - StatefulBuilder - The declaration setState isn't referenced

I'm writing an alertDialog where the user can type a name.我正在编写一个警报对话框,用户可以在其中输入名称。 The alertDialog has a "OK" button and a "Annulla" button. alertDialog 有一个“OK”按钮和一个“Annulla”按钮。 I want the "OK" button to be disabled while the textField is empty, and then enabled when the user types something.我希望在 textField 为空时禁用“确定”按钮,然后在用户键入内容时启用。

I'm using a statefulBuilder as recommended by some answers here on StackOverflow, but clearly my implementation is not working.我正在使用 StackOverflow 上的一些答案所推荐的 statefulBuilder,但显然我的实现不起作用。

  // Function to display a dialog to insert a new item to the list
  Future<void> _displayItemAddDialog(BuildContext context, provider) async {
    String itemName;

    // clear the textField and add the item to the list
    Future<void> onOKPressed() {
      _textFieldController.clear();
      Navigator.pop(context);
      provider.addItem(itemName);
    }

    showDialog(
        context: context,
        builder: (context) {
          return StatefulBuilder(
              builder: (BuildContext context, StateSetter setState) {
            // used to check if to enable the OK button
            bool okButtonEnabled = false;

            return AlertDialog(
              title: Text('Inserisci Nome Oggetto'),
              content: TextField(
                onChanged: (value) {
                  itemName = value;
                  print(value);
                  // if the TextField is not empty then enable the button
                  if (value != "") {
                    // not working :(
                    setState() => okButtonEnabled = true;
                  }
                },
                controller: _textFieldController,
                decoration: InputDecoration(hintText: 'Nome'),
              ),
              actions: <Widget>[
                TextButton(
                  onPressed: () {
                    _textFieldController.clear();
                    Navigator.pop(context);
                  },
                  child: Text('Annulla'),
                ),
                TextButton(
                    // if button enabled then I change the assigned function
                    onPressed: okButtonEnabled ? onOKPressed : null,
                    child: Text('OK')),
              ],
            );
          });
        });
  }

You should move your okButtonEnabled outside StatefulBuilder, so right above it.你应该把你的okButtonEnabled移到 StatefulBuilder 之外,就在它上面。

showDialog(
  context: context,
  builder: (context) {
    // Move okButtonEnabled here
    bool okButtonEnabled = false;

    return StatefulBuilder(
      builder: (BuildContext context, StateSetter setState) {
        return AlertDialog(
          title: Text('Inserisci Nome Oggetto'),
          content: TextField(
            onChanged: (value) {
              itemName = value;
              print(value);
              // if the TextField is not empty then enable the button
              if (value != "") {
                 setState(() => okButtonEnabled = true);
              }
            },
            controller: _textFieldController,
            decoration: InputDecoration(hintText: 'Nome'),
          ),
          actions: <Widget>[
            TextButton(
              onPressed: () {
                _textFieldController.clear();
                Navigator.pop(context);
              },
              child: Text('Annulla'),
            ),
            TextButton(
              // if button enabled then I change the assigned function
              onPressed: okButtonEnabled ? onOKPressed : null,
              child: Text('OK')),
          ],
        );
      },
    );
  },
);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM