【问题标题】:Creating widgets based on a list基于列表创建小部件
【发布时间】:2026-02-19 21:10:01
【问题描述】:

我有一个参数 n,我必须创建 n 个文本字段并监听它们,并捕获所有这些字段的值。 假设我必须对它们进行计算。我如何实现这一目标?我试图将循环与小部件结合起来,但我得到了很多错误。

当我使用单独的函数返回列的 children 属性的小部件列表时,它会抛出一个错误,指出 type int is not a subtype of type string of source

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    从您的d 参数生成一个列表,然后从该列表生成一个文本字段列表和文本编辑控制器

    createTexttextfields (int d){
        var textEditingControllers = <TextEditingController>[];
    
        var textFields = <TextField>[];
        var list = new List<int>.generate(d, (i) =>i + 1 );
        print(list);
    
        list.forEach((i) {
          var textEditingController = new TextEditingController(text: "test $i");
          textEditingControllers.add(textEditingController);
          return textFields.add(new TextField(controller: textEditingController));
        });
        return textFields;
    }
    

    然后在您的小部件的子属性中使用此功能,例如列小部件

    return new Scaffold(
      appBar: new AppBar(),
      body: new Column(
      children: createTexttextfields(6),
      ),
    );
    

    但是如果你想访问它们,你不能通过函数来​​做到这一点,你必须将它们创建为变量

    Widget build(BuildContext context) {
        var d=5;//the number of text fields 
        var textEditingControllers = <TextEditingController>[];
        var textFields = <TextField>[];
        var list = new List<int>.generate(d, (i) =>i + 1 );
        list.forEach((i) {
          var textEditingController = new TextEditingController(text: "test $i");
          textEditingControllers.add(textEditingController);
          return textFields.add(new TextField(controller: textEditingController));
        });
    
        return new Scaffold(
          appBar: new AppBar(),
          body: new Column(
          children: textFields),
          floatingActionButton: new FloatingActionButton(
            onPressed: (){
              //clear the text in the second TextEditingController
              textEditingControllers[1].clear(); 
            } ,
          ),
        );
      }
    } 
    

    Full Example

    【讨论】:

    • 谢谢兄弟,这行得通,我使用 Listview 而不是启用滚动,但还有一个疑问,我应该处理函数内部的输入吗?
    • 如果要处理文本输入,请将此函数转换为类中的字段
    【解决方案2】:
    return Container(
          height: 50,
          child: ListView.builder(
              scrollDirection: Axis.horizontal,
              itemCount: 60,
              itemBuilder: (context, index){
                return ButtonTheme(
                  minWidth: 20.0,
                  height: 20.0,
                  child: MaterialButton(
                    color:AppTheme.colorDark,
                    colorBrightness: Brightness.dark,
                    onPressed: () => print(index),
                    shape: RoundedRectangleBorder(borderRadius:
                    BorderRadius.circular(10.0)),
                    child:  Text('$index'),
                  ),
                );
            },
          ),
        );
    

    【讨论】:

      【解决方案3】:

      从列表创建List&lt;Widget&gt; 的非常通用的示例:

        Widget _buildColumn() {
          
          var stringList = ["a", "b", "c"];
      
          // Create a List<Text> (or List<MyWidget>) using each String from stringList
          var textList = stringList.map<Text>((s) => Text(s)).toList();
         
          // use that list however you want!
          return Column(children: textList);
       
        }
      

      看起来像这样:

      【讨论】: