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

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

        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);
          }),
        ],
      ),
    )

【问题讨论】:

    标签: flutter dart setstate


    【解决方案1】:

    试试这个:

    class ListOfIngs extends State<ListOfIngsWidget> {
      final int countIngs;
      final myController = new TextEditingController();
      ListOfIngs(
        this.countIngs,
      );
      Widget build(BuildContext contex) {
        return new Container(
            child: ListView.builder(
                itemCount: countIngs,
                itemBuilder: (context,index){
                  return Container(
                    child: TextField(
                      controller: myController,
                      decoration: InputDecoration(
                        border: OutlineInputBorder(),
                        labelText: 'Ingredient $index',
                      ),
                    ),
                  );
                },
              ),
           );
      }
    }
    

    【讨论】:

    • 我只有一个问题,每次用户按下按钮添加另一种成分时,我将如何更新页面?
    • 使用有状态小部件和 setState() 方法,如果您不熟悉,请参考一些教程
    • 它说'这个表达式的类型是'void',所以它的值不能被使用。'当我设置类调用的状态时
    • 我会问一个新问题,不要让cmets太杂乱,我会在一分钟内将链接发给你
    • 我实际上刚刚决定用新错误更新问题
    【解决方案2】:

    先说几件重要的事情:

    • 每个 TextField 都需要自己的 TextEditingController,因此在您的情况下,您需要一个 TextEditingController 列表。
    • 使用 TextField() 创建一个 TextField 类型的对象。在括号中你不能只写一个 for 循环,因为这里需要创建对象的参数。
    • 成分 $countIngs' 总是只给你长度。你想要的是你的变量 i,它在每次循环过程中都会增加。
    import 'package:flutter/material.dart';
    
    class ListOfIngsWidget extends StatefulWidget {
      final int countIngs;
    
      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=0; 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),
          ),
        );
      }
    }
    

    您现在可以使用 ListOfIngsWidget(5) 来调用小部件。

    【讨论】:

    • 非常感谢。我对 Flutter 还很陌生,所以我仍然不知道所有可能对代码产生很大影响的小事情。这非常有效。我只有一个问题,每次用户按下按钮添加另一种成分时,我将如何更新页面?
    【解决方案3】:

    问题在于ListView。它没有children: [] 属性。您需要先构建小部件列表

    List<Widget> list = [];
    
    for(int i = 0; i < countIngs; i ++) {
      list.add(TextField(
        controller: myController,
        decoration: InputDecoration(
          border: OutlineInputBorder(),
          labelText: 'Ingredient $i',
        ),
      ));
    }
    
    

    然后构建ListView

    ...
      ListView(
        children: list
      )
    ...
    

    注意:如果您要构建多个文本字段,请确保为每个字段创建不同的控制器。

    您也可以使用ListView.builder(),这对于许多项目来说更好。你可以使用它里面的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 2023-01-28
      • 2022-08-19
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      相关资源
      最近更新 更多