Android 如何为使用Flatter中的itemBuilder生成的列表中的每个项目分配不同的键?
我一直在设计一个应用程序,用户在其中搜索一个术语,并显示一个Android 如何为使用Flatter中的itemBuilder生成的列表中的每个项目分配不同的键?,android,user-interface,flutter,dart,flutter-layout,Android,User Interface,Flutter,Dart,Flutter Layout,我一直在设计一个应用程序,用户在其中搜索一个术语,并显示一个GridView,其中包含与该术语相关的所有图像。所有这些图像都是可拖动的 在同一页面的另一个GridView中,我放置了40个Dragtargets。因此,用户可以向上拖动搜索到的图像,并将其放置在其中一个DragTargets,从而能够选择40个图像 问题是,当我将一个图像拖动到Dragtarget网格时,所有40个Dragtarget都被相同的图像填充。我认为这是因为每个Dragtarget都具有相同的键,因为它是在itemBui
GridView
,其中包含与该术语相关的所有图像。所有这些图像都是可拖动的
在同一页面的另一个GridView
中,我放置了40个Dragtargets
。因此,用户可以向上拖动搜索到的图像,并将其放置在其中一个DragTargets
,从而能够选择40个图像
问题是,当我将一个图像拖动到Dragtarget
网格时,所有40个Dragtarget
都被相同的图像填充。我认为这是因为每个Dragtarget
都具有相同的键,因为它是在itemBuilder中生成的。但我不知道如何在生成时为每个Dragtarget
设置不同的键。也希望在实现相同场景时有其他解决方案
可拖动图像的代码:
SliverGrid(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 350,
mainAxisSpacing: 10,
crossAxisSpacing: 10),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
child: LongPressDraggable<String>(
data: imageLinks[index],
feedback: Image(
image: NetworkImage(imageLinks[index])),
child: Image(
image: NetworkImage(imageLinks[index])),
onDragStarted: () {
panelController.close();
},
),
);
SliverGrid(
gridDelegate:SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent:350,
平均间距:10,
交叉轴间距:10),
代表:SliverChildBuilderDelegate(
(BuildContext上下文,int索引){
返回容器(
儿童:可长按拖动(
数据:imageLinks[索引],
反馈:图像(
图像:网络图像(图像链接[索引]),
孩子:图像(
图像:网络图像(图像链接[索引]),
Ondrag开始:(){
panelController.close();
},
),
);
GridView和DragTargets的代码:
GridView.builder(
itemCount: 40,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 5,),
itemBuilder: (context,index){
return Container(
padding: EdgeInsets.only(top:5,right:5,bottom:5,left:5),
child: DragTarget<String>(
builder: (context, List<String> candidateData, rejectedData) {
if (dragged == true) {
return Container(
height: 50.0,
width: 50.0,
child: Image(
image: NetworkImage(draggedImage),
),
);
} else {
return Container(
height: 50.0,
width: 50.0,
color: Colors.yellow,
);
}
},
onWillAccept: (data) {
return true;
},
onAccept: (data) {
setState(() {
dragged = true;
draggedImage = data;
//panelController.open();
});
}
),
);}
),
GridView.builder(
物品计数:40,
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:5,),
itemBuilder:(上下文,索引){
返回容器(
填充:仅限边集(顶部:5,右侧:5,底部:5,左侧:5),
儿童:DragTarget(
生成器:(上下文、列表候选数据、拒绝数据){
如果(拖动==true){
返回容器(
身高:50.0,
宽度:50.0,
孩子:图像(
图像:网络图像(draggedImage),
),
);
}否则{
返回容器(
身高:50.0,
宽度:50.0,
颜色:颜色,黄色,
);
}
},
onWillAccept:(数据){
返回true;
},
onAccept:(数据){
设置状态(){
拖动=真;
draggedImage=数据;
//panelController.open();
});
}
),
);}
),
问题在于,您对所有dragtarget元素使用的是单个变量
让我用代码解释一下
onAccept: (data) {
setState(() {
dragged = true;
draggedImage = data;
//panelController.open();
});
}
在上面的代码中,您设置了draggedImage值true和draggedImage值true,这样每个小部件构建都具有相同的值
我希望我能澄清这个问题
解决方案:
要解决此问题,可以创建bool列表(如果希望所有dragtarget元素的bool值也保持不同)和draggedImage列表,同时保留每个单独元素的draggedImage,因此当您更改一个元素时,所有元素都不会更改。问题是您对所有dragtarget元素使用的是单个变量 让我用代码解释一下
onAccept: (data) {
setState(() {
dragged = true;
draggedImage = data;
//panelController.open();
});
}
在上面的代码中,您设置了draggedImage值true和draggedImage值true,这样每个小部件构建都具有相同的值
我希望我能澄清这个问题
解决方案:
为了解决这个问题,您可以创建一个bool列表(如果您想使所有dragtarget元素的bool值也不同)和draggedImage列表,同时为每个单独的元素保留draggedImage,这样当您更改一个元素时,所有的值都不会更改