如何在Flatter中使用listview创建类似的按钮?
我创建了一个博客应用程序在颤振和卡在一个类似的按钮功能。我想这样做(如果用户在Flitter listview中按下heart按钮,它将变为红色,再次按下时将变为原始状态),但当我单击like按钮时,listview中所有按钮的颜色都会发生变化。 这是我的代码片段如何在Flatter中使用listview创建类似的按钮?,listview,button,flutter,dart,Listview,Button,Flutter,Dart,我创建了一个博客应用程序在颤振和卡在一个类似的按钮功能。我想这样做(如果用户在Flitter listview中按下heart按钮,它将变为红色,再次按下时将变为原始状态),但当我单击like按钮时,listview中所有按钮的颜色都会发生变化。 这是我的代码片段 body: ListView.builder( itemCount: 10, physics: BouncingScrollPhysics(), itemBuilder: (context, ind
body: ListView.builder(
itemCount: 10,
physics: BouncingScrollPhysics(),
itemBuilder: (context, index) {
return Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.fromLTRB(3.0, 3.0, 3.0, 0.0),
child: singleItem(index),
),
Divider(height: 0.5, color: Constants.greyColor),
],
);
},
),
Widget singleItem(int index) {
return ListTile(
leading: CircleAvatar(
radius: 25.0,
foregroundColor: Constants.orangeColor,
backgroundColor: Constants.orangeColor,
backgroundImage:
NetworkImage("https://png.pngtree.com/svg/20161113/ef1b24279e.png"),
),
trailing:
Text("Jul23", style: TextStyle(color: Constants.ligthGreyColor)),
title: Text("Jea @jeaBooty.jul23",
style: TextStyle(
color: Constants.slightBlackColor,
fontSize: 16.0,
fontWeight: FontWeight.w600)),
subtitle: Container(
margin: const EdgeInsets.symmetric(vertical: 8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("Happy Birthday, hope you will have a wonderful Day"),
Container(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
IconButton(
onPressed: () {},
icon: Icon(Constants.commentIcon,
color: Constants.ligthGreyColor, size: 15.0),
),
SizedBox(width: 50.0),
IconButton(
onPressed: () {
if (!_isLike) {
setState(() {
_isLike = true;
color = Constants.orangeColor;
});
} else {
setState(() {
_isLike = false;
color = Constants.ligthGreyColor;
});
}
},
icon: Icon(Constants.crownIcon, color: color, size: 15.0),
),
],
),
),
],
),
),
);
body:ListView.builder(
物品计数:10,
物理:弹跳CrollPhysics(),
itemBuilder:(上下文,索引){
返回列(
儿童:[
填充物(
填充:LTRB(3.0,3.0,3.0,0.0)中的常量边集,
子项:单个项(索引),
),
分隔器(高度:0.5,颜色:常数。灰色),
],
);
},
),
小部件单项(int索引){
返回列表块(
领先:CircleAvatar(
半径:25.0,
foregroundColor:Constants.orangeColor,
背景颜色:Constants.orangeColor,
背景图片:
网络映像(“https://png.pngtree.com/svg/20161113/ef1b24279e.png"),
),
尾随:
文本(“Jul23”,样式:TextStyle(颜色:Constants.ligthGreyColor)),
标题:文本(“Jea@jeaBooty.jul23”,
样式:TextStyle(
颜色:常量。黑色,
字体大小:16.0,
fontWeight:fontWeight.w600),
字幕:集装箱(
边距:常数边集。对称(垂直:8.0),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
短信(“生日快乐,希望你有一个美好的一天”),
容器(
孩子:排(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
图标按钮(
按下:(){},
图标:图标(Constants.commentIcon,
颜色:常量。亮灰色,大小:15.0),
),
尺寸箱(宽度:50.0),
图标按钮(
已按下:(){
如果(!\u类似){
设置状态(){
_isLike=true;
颜色=常数。橙色颜色;
});
}否则{
设置状态(){
_isLike=false;
颜色=常数。亮灰色颜色;
});
}
},
图标:图标(常量。皇冠图标,颜色:颜色,大小:15.0),
),
],
),
),
],
),
),
);
}我想正如乔治·赫伯特在评论中提到的那样,似乎所有索引都使用相同的变量
\u类似于和颜色
也许您可以将isLike
的状态保存在列表中,即List\u like
中,然后使用索引访问当前状态,例如
...
IconButton(
onPressed: () {
setState(() {
_likes[index] = !_likes[index];
});
}
},
icon: Icon(Constants.crownIcon, color: _likes[index] ? Constants.orangeColor :
Constants.ligthGreyColor, size: 15.0),
),
...
定义bool类型的列表变量,如下所示:
List<bool> _likes = List.filled(length,true);
我猜您正在为该小部件的所有实例将\u isLike
和color
设置为true。我建议发布一个最小的应用程序,这样我们就可以看到你在做什么。这是一个单页应用程序。我正在练习创建一个类似的按钮。我关心的是,当我按下like按钮时,如何给列表视图中的特定项目赋予颜色?谢谢@GeorgeHerbert
IconButton(
icon: _likes[index]
? Icon(Icons.favorite_border,
color: Colors.grey,)
: Icon(Icons.favorite,
color: Colors.red,) ,
onPressed: () {
setState(() {
_likes[index] = !_likes[index];
});
},)