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