【问题标题】:Manage items in a List with their ids使用 ID 管理列表中的项目
【发布时间】:2021-04-01 11:15:57
【问题描述】:

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

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

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

我所说的插图:

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

My code 在 Github 上以及我的代码的一些相关部分:

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

我想要获取索引的位置在 favourite_screen.dart 这一行favModel.removeOfFavorite(index, index);

【问题讨论】:

  • 我想在两个不同的屏幕上显示两个列表。在第一个屏幕中,您可以添加项目,在第二个屏幕中您可以删除它们。我可以这样做,但我想设法在第一个屏幕中将正确的图标更改为正确的项目。

标签: list flutter dart


【解决方案1】:

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

编辑 您可以使用 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

【讨论】:

  • 如何通过我的提供者为正确的项目更改此布尔值?
  • 你可以使用For迭代列表,并检查里面的id
  • 在你必须更新收藏列表的地方使用它,在你的情况下FavModel
  • 您好,我有一个与此相关的新问题。如何使 favList 成为 List 而不是 List? favList 将是已添加到收藏夹的 id 列表。但是如何创建与正确 id 对应的项目呢?
  • 你的意思是从 id 列表到项目列表?
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多