android - 如何为 Flutter 中使用 itemBuilder 生成的列表中的每个项目分配不同的键?

标签 android user-interface flutter dart flutter-layout

我一直在设计一个应用程序,用户在其中搜索一个术语和一个 GridView显示包含与该术语相关的所有图像。所有这些图像都是由 Draggable 制作的.

在另一个 GridView在同一页面上,我放置了 40 Dragtargets .因此,用户可以拖动搜索到的图像并将其放置在 DragTargets 之一中,因此能够选择 40 张图像。

问题是当我将一张图片拖到 Dragtarget网格,所有 40 个 dragtargets被相同的图像填充。我认为这是因为每个 Dragtarget具有相同的键,因为它是在 itemBuilder 中生成的。但我不知道如何为每个 Dragtarget 设置不同的 key 在生成它时。在实现相同场景时也将不胜感激替代解决方案!

可拖动图像的代码:

                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();
                          },
                        ),
                      );

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();
                    });
                }
                  ),
                  );}
              ),

最佳答案

问题是您对所有 dragtarget 元素使用单个变量。

让我用代码解释一下。

onAccept: (data) {
                    setState(() {
                    dragged = true;
                    draggedImage = data;
                    //panelController.open();
                    });
                }

在上面的代码中,您将拖动值设置为 true 并将 draggedImage 值设置为 true,因此每个小部件都使用相同的值构建。

我希望我清楚问题。

解决方案:

要解决此问题,您可以创建一个 bool 列表(如果您想为所有 dragtarget 元素保持该 bool 值也不同)和 draggedImage 列表,同时为每个单独的元素按住draggedImage,因此当您更改时所有内容都不会改变一。

关于android - 如何为 Flutter 中使用 itemBuilder 生成的列表中的每个项目分配不同的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61714630/

相关文章:

android - 如何在 ANDROID 中通过 JSON 在 Web 数据库中保存和检索图像

javascript - 启用和禁用 ionic 中的输入字段

JavaFX:显示简单消息的最佳方式是什么?

css - Twitter Bootstrap 还是 Zurb Foundation?你喜欢哪个?

java - 二进制数据的未知编码/序列化

android - 在 Android 中更改蓝牙的 MTU 或数据包大小?

java - AWS 可以用作 android 后端吗?或者后端程序使用 AWS?

flutter - 如何检测带有 flutter/火焰的游戏中的滑动

android - 从 Activity 传递资源 ID 以初始化自定义 ViewGroup

flutter - 将小部件放置在边界框之外