让我解释一下,我有两个带有 Items
的列表视图。目前我没有给这些项目提供 id,但我有一个问题。事实上,当我从我的收藏夹列表中删除一个项目时,它不会改变 home_screen 上正确项目的图标(收藏或不收藏)。
我想获取菜单屏幕中项目的位置,以便我可以更改收藏夹列表中的图标。我正在使用 provider package。
所以我想知道为每个项目创建一个 id
并存储一个 List<int>
然后在我的收藏夹列表中创建一个 List<Item>
不是更好。此外,我可以使用此 ID 更改正确的图标。
但是我不知道如何使用这些 id 创建一个 List,然后更改正确的图标。
黑色 心 = 最喜欢,白色 心 = 不喜欢。 删除的是错误的项目。
Github 上的My code 和我的代码的一些相关部分:
favModel.dart
class FavModel extends ChangeNotifier {
List<Item> favList = [];
List<bool> isInFav = [];
addInFavorite(title, description, index){
Item item = Item(title: title, description: description, );
favList.add(item);
isInFav[index] = true;
notifyListeners();
}
removeOfFavorite(int index, int index2){
favList.removeAt(index);
isInFav[index2] = false;
notifyListeners();
}
implement(){
isInFav.add(false);
}
}
favorite_screen.dart
class Favorite extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Favorite'),
),
body: Consumer<FavModel>(
builder: (context, favModel, child) {
return ListView.builder(
itemCount: favModel.favList.length,
itemBuilder: (context, index) {
return TextObject(favModel.favList[index].title,
favModel.favList[index].description),
Padding(
padding: const EdgeInsets.all(7.0),
child: GestureDetector(
child: Icon(
Icons.favorite,
color: Colors.red,
size: 32,
),
onTap: () {
favModel.removeOfFavorite(index, index);
}),
),
});
},
),
);
}
}
home_screen.dart
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home'),
actions: [
IconButton(
icon: Icon(Icons.favorite_border),
onPressed: () => Navigator.push(
context,
MaterialPageRoute(
fullscreenDialog: true,
builder: (context) {
return Favorite();
},
),
),
),
],
),
body: Consumer<FavModel>(builder: (context, favModel, child) {
return ListView.builder(
shrinkWrap: false,
itemCount: itemData.length,
itemBuilder: (context, index) {
favModel.implement();
return TextObject(
itemData[index].title, itemData[index].description),
Padding(
padding: const EdgeInsets.all(7.0),
child: GestureDetector(
child: Icon(
favModel.isInFav.elementAt(index)
? Icons.favorite
: Icons.favorite_border,
color:
favModel.isInFav[index] ? Colors.red : null,
size: 32,
),
onTap: () {
favModel.isInFav[index]
? null
: Provider.of<FavModel>(context,
listen: false)
.addInFavorite(
itemData[index].title,
itemData[index].description,
index,
);
}),
);
});
}),
);
}
}
我想获取索引的地方是在此行的 favorite_screen.dart favModel.removeOfFavorite(index, index);
答案 0 :(得分:2)
我建议您将 bool isFavorite
添加到您的 class Item
并为课程添加一个 id。所以你可以避免有两个数组。
使用 id
将帮助您使用一些很棒的方法,例如 findWhere
和 removeWhere
编辑
您可以使用 for
for(int i = 0;i<favList.length;i++){
if(favList[i].id == selectedItem.id){
favList[i].isSelected = true;
break;// break the loop no need to continue
}
}
notifyListeners()
请注意,现在您必须传递 Item
而不是 index