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