使用 ID 管理列表中的项目

时间:2020-12-22 18:30:37

标签: list flutter dart

让我解释一下,我有两个带有 Items 的列表视图。目前我没有给这些项目提供 id,但我有一个问题。事实上,当我从我的收藏夹列表中删除一个项目时,它不会改变 home_screen 上正确项目的图标(收藏或不收藏)。

我想获取菜单屏幕中项目的位置,以便我可以更改收藏夹列表中的图标。我正在使用 provider package。 所以我想知道为每个项目创建一个 id 并存储一个 List<int> 然后在我的收藏夹列表中创建一个 List<Item> 不是更好。此外,我可以使用此 ID 更改正确的图标。

但是我不知道如何使用这些 id 创建一个 List,然后更改正确的图标。

我所说内容的插图:screenshot 1 screenshot 2

黑色 心 = 最喜欢,白色 心 = 不喜欢。 删除的是错误的项目。

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);

1 个答案:

答案 0 :(得分:2)

我建议您将 bool isFavorite 添加到您的 class Item 并为课程添加一个 id。所以你可以避免有两个数组。 使用 id 将帮助您使用一些很棒的方法,例如 findWhereremoveWhere

编辑 您可以使用 for

迭代 List
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