【问题标题】:'This expression has a type of 'void' so its value can't be used.' setState() error flutter'这个表达式的类型是'void',所以它的值不能被使用。' setState() 错误颤动
【发布时间】:2020-07-01 21:36:38
【问题描述】:

当我尝试重建一个类时,我收到了上面引用的错误。我正在调用的类 ListOfIngs() 是一个基本上创建 textField 的类,但我的目标是创建大量 TextField,变量 countIngs 在 listView 中保存确切数字的值。代码如下:

class NewGroceryList extends State<NewGroceryListWidget> {
  final GlobalKey<_ListOfIngsState> _key = GlobalKey();
  final myController = new TextEditingController();
  int countings = 0;
  Widget build(BuildContext context) {
    debugPrint(myController.text);
    return Scaffold(
        appBar: AppBar(
          title: Text("New Grocery List"),
          leading: IconButton(
            icon: const Icon(Icons.arrow_back_ios, color: Colors.white),
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => ListsPage()),
              );
            },
          ),
          actions: <Widget>[
            IconButton(
                icon: new Icon(Icons.check, color: Colors.white),
                onPressed: () {})
          ],
        ),
        drawer: AppDrawer(),
        body: Container(
          padding: EdgeInsets.fromLTRB(10.0, 20.0, 10.0, 30.0),
          child: Column(
            children: <Widget>[
              Row(
                children: <Widget>[
                  Text('Ingredients',
                      style: GoogleFonts.biryani(fontSize: 15.0)),
                  IconButton(
                    icon: new Icon(Icons.add),
                    onPressed: () {
                      setState(() {
                        countings++;
                      });
                      debugPrint('$countings');
                    },
                  )
                ],
              ),
              setState(() {
                ListOfIngsWidget(countings);
              }),
            ],
          ),
        ));
  }
}

这是 ListOfIngs 类/小部件: 类 ListOfIngsWidget 扩展 StatefulWidget { 最终整数计数;

  const ListOfIngsWidget(this.countIngs, {Key key}) : super(key: key);

  @override
  _ListOfIngsState createState() => _ListOfIngsState();
}

class _ListOfIngsState extends State<ListOfIngsWidget> {
  List<TextEditingController> _controllerList = [];
  List<TextField> _textFieldList = [];

  @override
  void initState() {
    for (int i = 1; i <= widget.countIngs; i++) {
      TextEditingController controller = TextEditingController();
      TextField textField = TextField(
        controller: controller,
        decoration: InputDecoration(
          border: OutlineInputBorder(),
          labelText: 'Ingredient $i',
        ),
      );
      _textFieldList.add(textField);
      _controllerList.add(controller);
    }
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return new Container(
      child: Flexible(
        child: ListView(children: _textFieldList),
      ),
    );
  }
}

【问题讨论】:

  • 能否请您发布更多代码,什么类型的变量是计数?我假设 int?
  • 是的,它是一个整数,我看看能不能发布与问题相关的所有内容
  • 移除ListOfIngsWidget(countings); 小部件周围的setState。您不能将setState 作为列的子项的一部分。一个 setState 应该足以重建整个类。
  • @AkoraIng.DKB 我认为这不起作用,当我按下按钮时,新的 textField 不会出现。

标签: flutter dart setstate


【解决方案1】:

删除ListOfIngsWidget 周围的setState 并添加UniqueKey(),如下所示:
ListOfIngsWidget(countings, key: UniqueKey())

【讨论】:

  • 非常感谢!这完美地工作,正是我想要的。如果我想在它们之间设置一个间隙,我会使用 SizedBox,我会放在哪里?
  • SizedBox 将出现在您的 Column 子项中 ListOfIngsWidget 的正上方
  • 您可以在 ListOfIngsWidget 中使用 ListView 的itemExtent。或者,您可以将TextField 包装在Padding 中,并指定topbottomvertical 填充。
  • 我是说你把Padding 小部件放在TextField 周围,然后再将它添加到列表中。有了你所做的,填充在 ListView 本身周围,所以它不会影响孩子。
  • 您不需要更改名称。您可以使用 List&lt;Widget&gt; _textFieldList 而不是显式声明类型。这样,您可以在其中放置任何小部件。然后你可以做_textFieldList.add(Padding(padding: EdgeInsets.all(10), child: textField))
猜你喜欢
  • 1970-01-01
  • 2021-09-09
  • 2023-01-28
  • 2022-08-19
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
相关资源
最近更新 更多