Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 在颤振中动态创建一列行的好方法是什么_User Interface_Flutter_Widget_Setstate - Fatal编程技术网

User interface 在颤振中动态创建一列行的好方法是什么

User interface 在颤振中动态创建一列行的好方法是什么,user-interface,flutter,widget,setstate,User Interface,Flutter,Widget,Setstate,因此,理想情况下,我想让用户在点击按钮时动态地在我的列中添加或删除一行。与点击+按钮一样,当点击X时,一行被添加到列中,反之亦然。但是,当我尝试使用相应的X按钮删除一行时,问题就出现了。似乎我的方法只能在点击x时删除随机行,而不能删除预期行。如果用户已经在某一行中输入了数据,然后只想删除这一行,那么这样的行为对用户来说已经足够好了 r0+ r1。。。。。X(当在此处点击X时,r2或其他行可能会被删除,其他X按钮也是如此) r2。。。。。X 到目前为止,我已经采取了两种方法来实现我的预期功能。第一

因此,理想情况下,我想让用户在点击按钮时动态地在我的列中添加或删除一行。与点击+按钮一样,当点击X时,一行被添加到列中,反之亦然。但是,当我尝试使用相应的X按钮删除一行时,问题就出现了。似乎我的方法只能在点击x时删除随机行,而不能删除预期行。如果用户已经在某一行中输入了数据,然后只想删除这一行,那么这样的行为对用户来说已经足够好了

r0+

r1。。。。。X(当在此处点击X时,r2或其他行可能会被删除,其他X按钮也是如此)

r2。。。。。X

到目前为止,我已经采取了两种方法来实现我的预期功能。第一个是使用简单的valuenotifier和for循环。比如

final number = new ValueNotifier(0);

new IconButton(
  icon: Icon(Icons.add),
  onPressed: () {
    number.value++;
    print(number.value);
    setState(() {});
  })

new Column(
  children: buildPartsWidget(number.value),
)

List<Widget> buildPartsWidget(int counts){
    List<Widget> ret = [];
    for(int i = 0; i < counts; i++){
      var temp = buildPartsRow();
      ret = List.from(ret)..add(temp);
    }
    return ret;
  }

Row buildPartsRow(int key) {
    return new Row(children: <Widget>[

      new IconButton(
        icon: Icon(Icons.clear), 
        onPressed: () {
          number.value--;
          setState(() {});
        })
    ]);
  }

final number=新的ValueNotifier(0);
新图标按钮(
图标:图标(Icons.add),
已按下:(){
数值++;
打印(数字、值);
setState((){});
})
新专栏(
子项:buildPartsWidget(number.value),
)
列出buildPartsWidget(整数计数){
列表ret=[];
对于(int i=0;i
第二种方法是使用映射将行与数字配对,这两种方法都不起作用,例如:

Map<int, Row> rowMap = new Map();
int rowIndex;

List<Widget> rowList(){
    List<Widget> ret = [];
    rowMap.forEach((k, v) => ret.add(v));
    return ret;
  } 

new IconButton(
  icon: Icon(Icons.add),
  onPressed: () {
    rowMap[rowIndex] = buildPartsRow(rowIndex);
    rowIndex++;
    setState(() {});
  })

new Column(
  children: rowList
)


Row buildPartsRow(int key) {
    return new Row(children: <Widget>[

      new IconButton(
        icon: Icon(Icons.clear), 
        onPressed: () {
          rowMap.remove(key);
          setState(() {});
        })
    ]);
  }
Map rowMap=newmap();
整数行索引;
列表行列表(){
列表ret=[];
rowMap.forEach((k,v)=>ret.add(v));
返回ret;
} 
新图标按钮(
图标:图标(Icons.add),
已按下:(){
rowMap[rowIndex]=buildPartsRow(rowIndex);
rowIndex++;
setState((){});
})
新专栏(
儿童:行列表
)
行buildPartsRow(int键){
返回新行(子行:[
新图标按钮(
图标:图标(图标。清除),
已按下:(){
rowMap.remove(键);
setState((){});
})
]);
}
我觉得我理解这两种方法的潜在问题。据我所知,发生这种行为是因为在这两种方法中,颤振都重建了entrie柱,并且没有办法也不“关心”行中的输入数据。我应该如何修正我的方法?还是有更好的方法来实现我的预期功能


我也尝试过使用listView,但它对我不起作用。由于我正在使用的所有小部件都已经在listview中,因此在listview中使用listview似乎需要我使用容器或sizedbox来限制内部listview的大小,这将在我的表单上给我一个框。我不想要表格上的方框。有没有一种方法可以使用listview,但不需要一个框来限制它的大小?

创建动态窗口小部件列的好方法是使用
listview.builder
。请在此处查找文档:


创建动态窗口小部件列的好方法是使用
ListView.builder
。请在此处查找文档:


对不起,我忘了提一件事。我已经尝试过这种方法,但对我不起作用。由于我正在使用的所有小部件都已经在listview中,因此在listview中使用listview似乎需要我使用容器或sizedbox来限制内部listview的大小,这将在我的表单上给我一个框。我不想要表格上的方框。有没有一种方法可以使用列表视图,但不需要一个框来限制其大小?我认为列表视图中的列表视图问题可能是一个大小/约束问题?如果是这样,试着把它们放在一个扩展的小部件中。约束的问题是,如果您试图将没有约束的内容放入没有约束的内容中,它将成为溢出错误。(例如,像列中的列、行中的行或行中的textfield)但将它们包装在扩展的小部件中是有效的。@ArthurEKing我也尝试过。我让listview包装在一个扩展的包装在一个列中。但是它不会编译,除非列被容器包装,或者扩展被sizedbox包装抱歉,我忘了提到一件事。我已经尝试过这种方法,但对我不起作用。由于我正在使用的所有小部件都已经在listview中,因此在listview中使用listview似乎需要我使用容器或sizedbox来限制内部listview的大小,这将在我的表单上给我一个框。我不想要表格上的方框。有没有一种方法可以使用列表视图,但不需要一个框来限制其大小?我认为列表视图中的列表视图问题可能是一个大小/约束问题?如果是这样,试着把它们放在一个扩展的小部件中。约束的问题是,如果您试图将没有约束的内容放入没有约束的内容中,它将成为溢出错误。(例如,像列中的列、行中的行或行中的textfield)但将它们包装在扩展的小部件中是有效的。@ArthurEKing我也尝试过。我让listview包装在一个扩展的包装在一个列中。但是它不会编译,除非列由容器包装,或者扩展的列由sizedbox包装
ListView.builder(
  itemCount: rowMap.length,
  itemBuilder: (context, index) {
    return buildPartsRow(rowMap[index]);
  }
)