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
相关产品推荐
相关产品推荐

