【问题标题】:Update item widget from local database list从本地数据库列表更新项目小部件
【发布时间】:2022-07-14 17:26:04
【问题描述】:

我在我的应用程序中使用现成的本地数据库,问题是我无法更新列表中的一项。如果我将章节添加到收藏夹,则按钮的状态仅在页面重新打开后才会更新。同样,收藏夹列表仅在重新打开页面时更新。现在,当我添加/删除收藏夹时,我会动态加载整个列表以便它更新值,但我只需要更新一个项目,我如何使用提供程序来做到这一点?我没有给出代码示例,因为我想准确地理解动作的逻辑

UPD:

我的代码:

@override
  Widget build(BuildContext context) {
    return FutureBuilder<List>(
      future: _databaseQuery.getAllChapters(),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
      return snapshot.connectionState == ConnectionState.done &&
            snapshot.hasData
        ? CupertinoScrollbar(
            child: ListView.builder(
              physics: const BouncingScrollPhysics(),
              itemCount: snapshot.data!.length,
              itemBuilder: (BuildContext context, int index) {
                return MainChapterItem(
                  item: snapshot.data![index],
                );
              },
            ),
          )
        : const Center(
            child: CircularProgressIndicator.adaptive(),
          );
  },
);

}

项目:

final MainChapterItemModel item;

@override
Widget build(BuildContext context) {
return Material(
  child: InkWell(
    child: Container(
      padding: const EdgeInsets.all(8),
      child: Row(
        children: [
          IconButton(
            icon: item.favoriteState == 0
                ? const Icon(CupertinoIcons.bookmark)
                : const Icon(CupertinoIcons.bookmark_fill),
            splashRadius: 22,
            splashColor: const Color(0xff81b9b0),
            onPressed: () {
              context.read<BookmarkButtonState>().addRemoveChapterBookmark(
                  item.favoriteState == 0 ? 1 : 0, item.id);
            },
          ),
          const SizedBox(
            width: 8,
          ),
          Flexible(
            child: ListTile(
              contentPadding: EdgeInsets.zero,
              title: Padding(
                padding: const EdgeInsets.only(bottom: 8),
                child: Text(
                  item.chapterNumber,
                  style: TextStyle(
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ),
              subtitle: Html(
                data: item.chapterTitle,
                style: {
                  '#': Style(
                    fontSize: const FontSize(17),
                    padding: EdgeInsets.zero,
                    margin: EdgeInsets.zero,
                  ),
                  'small': Style(
                    fontSize: const FontSize(8),
                  ),
                  'a': Style(
                    fontSize: const FontSize(14),
                    color: Colors.blue,
                  ),
                },
              ),
            ),
          ),
        ],
      ),
    ),
    onTap: () {},
  ),
);
}

问题是当我添加到收藏夹或删除时,按钮状态没有更新。并且在收藏列表中,该项目在点击时并没有被删除,而是在重新打开页面后消失:

IconButton(
        icon: item.favoriteState == 0
            ? const Icon(CupertinoIcons.bookmark)
            : const Icon(CupertinoIcons.bookmark_fill),
        splashRadius: 22,
        splashColor: const Color(0xff81b9b0),
        onPressed: () {
          context.read<BookmarkButtonState>().addRemoveChapterBookmark(
              item.favoriteState == 0 ? 1 : 0, item.id);
        },
      ),

提供者代码:

final DatabaseQuery _databaseQuery = DatabaseQuery();

DatabaseQuery get getDatabaseQuery => _databaseQuery;

addRemoveChapterBookmark(int state, int chapterId) {
_databaseQuery.addRemoveFavoriteChapter(state, chapterId);
notifyListeners();

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。另外,你有没有检查过State Management works。也许这就是缺少的东西。

标签: flutter dart listview future builder


【解决方案1】:

我通过签署所有列表来侦听提供程序中的 databaseQuery 解决了这个问题:

future: context.watch<BookmarkButtonState>().getDatabaseQuery.getAllChapters(),

【讨论】:

    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多