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,这样当您更改一个元素时,所有的值都不会更改