【问题标题】:Flutter, How do I add favorites inside a ListView.builderFlutter,如何在 ListView.builder 中添加收藏夹
【发布时间】:2021-01-10 10:04:48
【问题描述】:

我试图允许用户将由 ListView.builder 构建的帖子标记为 like 。使用我当前的代码,当用户喜欢一个帖子时,所有帖子都被标记为收藏。我希望用户能够单独添加每个帖子,并在重新启动后保留该收藏夹。我已将数据保存到 api,但似乎应该在应用程序本身中处理。

这是我的代码:

bool isFavourite = false;

ListView.builder(
          itemCount: serviceProvider.justPostsModel.length,
          itemBuilder: (context, index) {
            return Padding(
              padding: const EdgeInsets.only(left: 4.0, right: 4.0, bottom: 4),
              child: InkWell(
                onTap: ()  {
                  
                },
                child: Container(
                  width: MediaQuery.of(context).size.width,
                  child: Card(
                    child: Column(
                        children: [
                          Padding(
                            padding:
                                const EdgeInsets.only(left: 8.0, right: 12),
                            child: Row(
                              children: [
                                InkWell(
                                  onTap: () async {
                                    if (isFavourite == false) {
                                      await serviceProvider.setToggleLike(
                                          context,
                                          serviceProvider
                                              .justPostsModel[index].id);
                                      await serviceProvider
                                          .getPostsList(context);
                                      setState(() {
                                        isFavourite = true;
                                      });
                                    } else {
                                      await serviceProvider.setToggleLike(
                                          context,
                                          serviceProvider
                                              .justPostsModel[index].id);
                                      await serviceProvider
                                          .getPostsList(context);
                                      setState(() {
                                        isFavourite = false;
                                      });
                                    }
                                  },
                                  child: Icon(
                                    isFavourite == false
                                        ? Icons.favorite_border
                                        : Icons.favorite,
                                    color: Constants.skyColor(),
                                  ),
                                ),
                              ],
                            ),
                          ),
                        ]),
                  ),
                ),
              ),
            );
          },
        ),

那么,我怎样才能以最好的方式做到这一点!

【问题讨论】:

    标签: flutter user-interface dart


    【解决方案1】:

    您应该有一个包含喜爱状态的列表。

    //length should be equal serviceProvider.justPostsModel.length
    //put some initial value (true, false) in each index according to its favorite status
    List<bool> isFavourite;
    

    然后

    ListView.builder(
              itemCount: serviceProvider.justPostsModel.length,
              itemBuilder: (context, index) {
                return Padding(
                  padding: const EdgeInsets.only(left: 4.0, right: 4.0, bottom: 4),
                  child: InkWell(
                    onTap: ()  {
                      
                    },
                    child: Container(
                      width: MediaQuery.of(context).size.width,
                      child: Card(
                        child: Column(
                            children: [
                              Padding(
                                padding:
                                    const EdgeInsets.only(left: 8.0, right: 12),
                                child: Row(
                                  children: [
                                    InkWell(
                                      onTap: () async {
                                        if (isFavourite[index] == false) {
                                          await serviceProvider.setToggleLike(
                                              context,
                                              serviceProvider
                                                  .justPostsModel[index].id);
                                          await serviceProvider
                                              .getPostsList(context);
                                          setState(() {
                                            isFavourite[index] = true;
                                          });
                                        } else {
                                          await serviceProvider.setToggleLike(
                                              context,
                                              serviceProvider
                                                  .justPostsModel[index].id);
                                          await serviceProvider
                                              .getPostsList(context);
                                          setState(() {
                                            isFavourite[index] = false;
                                          });
                                        }
                                      },
                                      child: Icon(
                                        isFavourite[index] == false
                                            ? Icons.favorite_border
                                            : Icons.favorite,
                                        color: Constants.skyColor(),
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                            ]),
                      ),
                    ),
                  ),
                );
              },
            ),
    

    【讨论】:

    • 当我尝试它时.. 出现此错误在 null 上调用了方法“[]”。接收者:null 尝试调用:[](0)
    • 我认为您没有在 isFavorite 列表中添加任何值。您必须在其中放入 n 个布尔值。
    • 如果你的列表有 5 个元素,那么你需要像这样最初推送 [false, false, false, false, false]
    • 你是对的,最后一件事:当我关闭应用程序并重新启动它时,isFavourite[index] 上的值返回 false(它不保存最后一个布尔值)你知道我怎么能每次打开应用程序时保存最后一个值
    • 您是从云端还是从本地数据库获取数据?您需要从获取数据的位置更新收藏状态。
    【解决方案2】:

    每个帖子在数据库中都应该有 isLiked 字段,并且根据这个条件你可以显示它是否被喜欢。

    【讨论】:

    • 它有,但在我的情况下,我想要的帖子中的计数器增加了,但所有列表中的图标都发生了变化
    • 因为您将isFavourite 应用于所有帖子。您需要检查一个变量。
    • 拜托,你能解释一下怎么做吗,好心!
    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2023-03-20
    相关资源
    最近更新 更多