You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter SQFlite收藏功能:判断数据存在性并切换图标颜色

解决Flutter收藏图标异步状态切换问题

不需要新建未保存单词表,用FutureBuilder就能解决你遇到的异步判断问题,而且可以和现有基于Map的搜索功能无缝结合,具体方案如下:

  • 先确保你的checkFavourite是标准异步函数,返回Future<bool>用于查询SQFlite表中是否存在目标数据:
Future<bool> checkFavourite(String word) async {
  Database db = await DBHelper.instance.database; // 假设你有DBHelper类管理数据库
  var queryResult = await db.query(
    'favourites',
    where: 'word = ?',
    whereArgs: [word],
  );
  return queryResult.isNotEmpty;
}
  • 在搜索结果的列表项中,用FutureBuilder包裹收藏图标组件。搜索结果更新时列表会自动重建,每个图标都会重新查询状态:
// 假设searchResults是你从Map中提取的搜索结果列表
ListView.builder(
  itemCount: searchResults.length,
  itemBuilder: (context, index) {
    String targetWord = searchResults[index];
    return ListTile(
      title: Text(targetWord),
      trailing: FutureBuilder<bool>(
        future: checkFavourite(targetWord),
        initialData: false, // 默认显示未收藏状态
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            // 根据查询结果切换图标颜色
            return Icon(
              Icons.favorite,
              color: snapshot.data! ? Colors.red : Colors.grey,
            );
          }
          // 数据库查询中显示占位图标
          return Icon(Icons.favorite_border, color: Colors.grey);
        },
      ),
      onTap: () async {
        // 点击切换收藏状态的逻辑
        bool isFav = await checkFavourite(targetWord);
        if (isFav) {
          // 从收藏表删除
          await DBHelper.instance.deleteFavourite(targetWord);
        } else {
          // 添加到收藏表
          await DBHelper.instance.insertFavourite(targetWord);
        }
        // 触发重绘更新图标
        setState(() {});
      },
    );
  },
)
  • 性能优化:添加缓存Map存储已查询的单词状态,避免重复访问数据库:
Map<String, bool> _favStatusCache = {};

Future<bool> checkFavourite(String word) async {
  // 先查缓存,存在直接返回
  if (_favStatusCache.containsKey(word)) {
    return _favStatusCache[word]!;
  }
  // 缓存不存在再查数据库
  Database db = await DBHelper.instance.database;
  var queryResult = await db.query(
    'favourites',
    where: 'word = ?',
    whereArgs: [word],
  );
  bool isFav = queryResult.isNotEmpty;
  // 更新缓存
  _favStatusCache[word] = isFav;
  return isFav;
}

切换收藏状态后记得同步更新缓存,比如删除/添加后执行_favStatusCache[targetWord] = !isFav;,再调用setState触发重绘。

内容的提问来源于stack exchange,提问作者Baysangur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:40:23