Flutter 颤振:响应相同单击的所有ListTile项目

Flutter 颤振:响应相同单击的所有ListTile项目,flutter,listview,flutter-layout,Flutter,Listview,Flutter Layout,我是一个新手,所以我尝试构建一个可滚动的listtile对象。因此,在构建它之后,我试图让图标按钮在按下时改变颜色,这很有效,但当我按下一个按钮时,它会改变所有项目的颜色。我想这与为每个项目分配一个唯一的id/密钥有关,但我不确定这是否是问题所在,甚至不知道如何做到这一点。代码如下: 类列表扩展了StatefulWidget{ @凌驾 _ListsState createState()=>\u ListsState(); } 类_ListsState扩展状态{ 颜色_statusColor=Co

我是一个新手,所以我尝试构建一个可滚动的listtile对象。因此,在构建它之后,我试图让图标按钮在按下时改变颜色,这很有效,但当我按下一个按钮时,它会改变所有项目的颜色。我想这与为每个项目分配一个唯一的id/密钥有关,但我不确定这是否是问题所在,甚至不知道如何做到这一点。代码如下:

类列表扩展了StatefulWidget{
@凌驾
_ListsState createState()=>\u ListsState();
}
类_ListsState扩展状态{
颜色_statusColor=Colors.grey;
列表项=[
项目列表(
标题:“年度最佳音乐”,
描述:“大卫”,
),
项目列表(
标题:“最佳专辑封面设计”,
描述:“光明出版社”,
),
项目列表(
标题:“最佳歌手”,
描述:“Simi Sola”,
),
];
@凌驾
小部件构建(构建上下文){
返回列(
子项:items.map(
(项目){
返回容器(
孩子:卡片(
孩子:ListTile(
领先:新图标按钮(
图标:图标(
明星,
颜色:_statusColor,
),
工具提示:“添加到收藏夹”,
已按下:(){
设置状态(){
如果(_statusColor==Colors.grey){
_statusColor=Colors.green;
}否则{
_statusColor=Colors.grey;
}
});
}),
标题:文本(“${items.title}”),
字幕:文本(“${items.description}”),
尾随:图标按钮(图标:图标(Icons.delete),ON按下:null),
)));
},
).toList());
}
}
提前谢谢

下面是编辑后的代码

类列表扩展了StatefulWidget{
@凌驾
_ListsState createState()=>\u ListsState();
}
类_ListsState扩展状态{
颜色_statusColor=Colors.grey;
列表项=[
项目列表(
标题:“年度最佳音乐”,
描述:“大卫”,
最喜欢的:假,
),
项目列表(
标题:“最佳专辑封面设计”,
描述:“光明出版社”,
最喜欢的:假,
),
项目列表(
标题:“最佳歌手”,
描述:“Simi Sola”,
最喜欢的:假,
),
];
@凌驾
小部件构建(构建上下文){
返回列(
子项:items.map(
(项目){
返回容器(
孩子:卡片(
孩子:ListTile(
领先:新图标按钮(
图标:图标(
明星,
颜色:项目。最喜欢的颜色?绿色:颜色。灰色,
),
工具提示:“添加到收藏夹”,
已按下:(){
设置状态(){
items.favorite=!items.favorite;
});
}),
标题:文本(“${items.title}”),
字幕:文本(“${items.description}”),
尾随:图标按钮(图标:图标(Icons.delete),ON按下:null),
)));
},
).toList());
}
}
下面是我的数据模型

类项目列表{
字符串标题;
字符串描述;
布尔最爱;
ItemList({this.title,this.description,this.favorite});
}

我想做的是一个Todo应用程序,当用户完成一项特定任务时,可以轻松地单击星号图标按钮。

这是因为您只有一个颜色变量分配给列表中的所有项目;如果该变量更改,则所有项目也会更改

解决这个问题的方法有很多种;一种可能的解决方案是向“ItemList”对象添加另一个属性:

List<ItemLists> items = [
ItemLists(
  title: 'Best Music of the Year',
  discription: 'Davido',
  favorite: false,  // add this as a boolean to indicate if the item is a favorite or not
),

这应该可以工作。

我更改了它们,但出现了此错误[断言失败:布尔表达式不能为空]此错误来自何处?您是否已将“false”指定给favorite属性或使用“false”作为默认值?我将编辑初始问题并添加新的编码。您可以查看stacktrace并检查错误发生的位置吗?我复制了上面的代码,它为我工作没有任何问题。它现在正在工作。。。我只需要重新启动我的系统,现在一切正常
 return Container(
          child: Card(
              child: ListTile(
        leading: new IconButton(
            icon: Icon(
              Icons.star,
              color: items.favorite ? Colors.green : Colors.grey,  // change this
            ),
            tooltip: 'Add to Favorite',
            onPressed: () {
              setState(() {
                items.favorite = !items.favorite; // and change this
              });
            }),
        title: Text('${items.title}'),
        subtitle: Text('${items.discription}'),
        trailing: IconButton(icon: Icon(Icons.delete), onPressed: null),
      )));