Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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
Flutter 如何在Flatter中单击图像后使用inkwell在图像上创建图标_Flutter_Gridview - Fatal编程技术网

Flutter 如何在Flatter中单击图像后使用inkwell在图像上创建图标

Flutter 如何在Flatter中单击图像后使用inkwell在图像上创建图标,flutter,gridview,Flutter,Gridview,我在颤振应用程序中创建了一个网格视图。但就像下面链接上的图片一样,我想在图片上创建一个图标,并在点击图片后更改背景色 我一直在想办法,但我终于有个问题了。如果你能让我知道,我会由衷地感激你 请输入img链接(如下) 您应该创建具有isSelected值的图像列表,当用户单击项目时,它们会设置具有imageURL和isSelected变量的旧值的真/假基数。首先,您应该将值存储在图像对象列表中。这来自Firebase/API,然后在下面的步骤中流动。我已经创建了一个演示和张贴在这里。请参考 示例

我在颤振应用程序中创建了一个网格视图。但就像下面链接上的图片一样,我想在图片上创建一个图标,并在点击图片后更改背景色

我一直在想办法,但我终于有个问题了。如果你能让我知道,我会由衷地感激你

请输入img链接(如下)


您应该创建具有
isSelected
值的图像列表,当用户单击项目时,它们会设置具有
imageURL
isSelected
变量的旧值的真/假基数。首先,您应该将值存储在图像对象列表中。这来自Firebase/API,然后在下面的步骤中流动。我已经创建了一个演示和张贴在这里。请参考

示例代码

class Demo extends StatefulWidget {
  @override
  _DemoState createState() => _DemoState();
}

class _DemoState extends State<Demo> {
  List<ImageData> imageList;

  @override
  void initState() {
    super.initState();
    imageList = ImageData.getImage();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GridView.builder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            childAspectRatio: 0.5,
            crossAxisCount: 5,
            crossAxisSpacing: 2.0,
            mainAxisSpacing: 2.0),
        itemCount: imageList.length,
        itemBuilder: (builder, index) {
          return InkWell(
              onTap: () {
                setState(() {
                  imageList[index].isSelected = !imageList[index].isSelected;
                });
              },
              child: Stack(
                children: [
                  _getImage(imageList[index].imageURL),
                  Opacity(
                    opacity: imageList[index].isSelected ? 1 : 0,
                    child: Stack(
                      children: [
                        Container(
                          width: double.infinity,
                          height: double.infinity,
                          color: Colors.black38,
                        ),
                        Center(
                          child: CircleAvatar(
                            backgroundColor: Colors.greenAccent,
                            child: Icon(
                              Icons.check,
                              color: Colors.white,
                            ),
                          ),
                        )
                      ],
                    ),
                  )
                ],
              ));
        },
      ),
    );
  }

  _getImage(url) => Image.network(
        url,
        height: 500,
        fit: BoxFit.fitHeight,
      );

  @override
  void dispose() {
    super.dispose();
  }
}

class ImageData {
  String imageURL;
  bool isSelected;
  int id;

  ImageData(this.imageURL, this.isSelected, this.id);

  static List<ImageData> getImage() {
    return [
      ImageData('https://picsum.photos/200', false, 1),
      ImageData('https://picsum.photos/100', false, 2),
      ImageData('https://picsum.photos/300', false, 3),
      ImageData('https://picsum.photos/400', false, 4),
      ImageData('https://picsum.photos/500', false, 5),
      ImageData('https://picsum.photos/600', false, 6),
      ImageData('https://picsum.photos/700', false, 7),
      ImageData('https://picsum.photos/800', false, 8),
      ImageData('https://picsum.photos/900', false, 9),
    ];
  }
}
类演示扩展StatefulWidget{
@凌驾
_DemoState createState();
}
类_DemoState扩展了状态{
列表图像列表;
@凌驾
void initState(){
super.initState();
imageList=ImageData.getImage();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:GridView.builder(
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
childAspectRatio:0.5,
交叉轴计数:5,
交叉轴间距:2.0,
主轴间距:2.0),
itemCount:imageList.length,
itemBuilder:(生成器,索引){
回墨槽(
onTap:(){
设置状态(){
imageList[index].isSelected=!imageList[index].isSelected;
});
},
子:堆栈(
儿童:[
_getImage(imageList[index].imageURL),
不透明(
不透明度:imageList[索引]。已选择?1:0,
子:堆栈(
儿童:[
容器(
宽度:double.infinity,
高度:双无限,
颜色:颜色。黑色38,
),
居中(
孩子:圆环星(
背景颜色:Colors.greenAccent,
子:图标(
图标。检查,
颜色:颜色,白色,
),
),
)
],
),
)
],
));
},
),
);
}
_getImage(url)=>Image.network(
网址,
身高:500,
适合度:BoxFit.fit高度,
);
@凌驾
无效处置(){
super.dispose();
}
}
类图像数据{
字符串imageURL;
布尔当选;
int-id;
ImageData(this.imageURL、this.isSelected、this.id);
静态列表getImage(){
返回[
图像数据('https://picsum.photos/200",错,1),,
图像数据('https://picsum.photos/100",错,2),,
图像数据('https://picsum.photos/300",错,3),,
图像数据('https://picsum.photos/400",错,4),,
图像数据('https://picsum.photos/500",错,5),,
图像数据('https://picsum.photos/600",错,6),,
图像数据('https://picsum.photos/700",错,7),,
图像数据('https://picsum.photos/800",错,8),,
图像数据('https://picsum.photos/900",错,9),,
];
}
}
输出


这是选择选项,如果您发送完整的代码,就可以了。我刚刚添加了它!!非常感谢你让我知道!!!我会试着让你知道。如果你真的对我的解决方案有帮助,那么接受它:)根据你的代码,你应该在fF.shuffle()之后将图像添加到imageList中;还有GridViewI中的用户引用。非常感谢。我无法用你发布的代码解决这个问题,所以我用完整的代码再次发布了这个问题。你能看一下吗?
      Widget _buildListItem(context, document) {
    return Ink.image(
     image : NetworkImage(document['thumbnail_img']),
     fit : BoxFit.cover,
      child: new InkWell(
       //I think we need to get something in here....
        onTap: (){},
      ),
     );
  }
class Demo extends StatefulWidget {
  @override
  _DemoState createState() => _DemoState();
}

class _DemoState extends State<Demo> {
  List<ImageData> imageList;

  @override
  void initState() {
    super.initState();
    imageList = ImageData.getImage();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GridView.builder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            childAspectRatio: 0.5,
            crossAxisCount: 5,
            crossAxisSpacing: 2.0,
            mainAxisSpacing: 2.0),
        itemCount: imageList.length,
        itemBuilder: (builder, index) {
          return InkWell(
              onTap: () {
                setState(() {
                  imageList[index].isSelected = !imageList[index].isSelected;
                });
              },
              child: Stack(
                children: [
                  _getImage(imageList[index].imageURL),
                  Opacity(
                    opacity: imageList[index].isSelected ? 1 : 0,
                    child: Stack(
                      children: [
                        Container(
                          width: double.infinity,
                          height: double.infinity,
                          color: Colors.black38,
                        ),
                        Center(
                          child: CircleAvatar(
                            backgroundColor: Colors.greenAccent,
                            child: Icon(
                              Icons.check,
                              color: Colors.white,
                            ),
                          ),
                        )
                      ],
                    ),
                  )
                ],
              ));
        },
      ),
    );
  }

  _getImage(url) => Image.network(
        url,
        height: 500,
        fit: BoxFit.fitHeight,
      );

  @override
  void dispose() {
    super.dispose();
  }
}

class ImageData {
  String imageURL;
  bool isSelected;
  int id;

  ImageData(this.imageURL, this.isSelected, this.id);

  static List<ImageData> getImage() {
    return [
      ImageData('https://picsum.photos/200', false, 1),
      ImageData('https://picsum.photos/100', false, 2),
      ImageData('https://picsum.photos/300', false, 3),
      ImageData('https://picsum.photos/400', false, 4),
      ImageData('https://picsum.photos/500', false, 5),
      ImageData('https://picsum.photos/600', false, 6),
      ImageData('https://picsum.photos/700', false, 7),
      ImageData('https://picsum.photos/800', false, 8),
      ImageData('https://picsum.photos/900', false, 9),
    ];
  }
}