Flutter中Firebase实时数据库isFavorite字段获取异常问题
问题解决:Firebase收藏状态刷新后不显示填充图标
问题根源
从Firebase数据库结构可见,userFavorites/$userId/$prodId存储的是包含isFavorite字段的对象(如{"isFavorite": true}),但ProductsProvider的fetchAndSetProduct方法中,错误地将favoriteData[prodId]当作布尔值处理,导致即使Firebase中值为true,也会被判定为非布尔类型,最终isFavorite被设置为false。
修复方案
修改fetchAndSetProduct方法中isFavorite的赋值逻辑,正确读取对象中的isFavorite字段值:
修改后的关键代码片段
loadedProducts.add(Product( id: prodId, title: prodData['title'] ?? '', description: prodData['description'] ?? '', price: prodData['price'] ?? 0.0, imageUrl: prodData['imageUrl'] ?? '', isFavorite: favoriteData == null ? false : favoriteData[prodId] != null ? favoriteData[prodId]['isFavorite'] ?? false : false, ));
完整修改后的fetchAndSetProduct方法
Future<void> fetchAndSetProduct() async { var url = Uri.parse( 'https://shopapp-bd154-default-rtdb.firebaseio.com/products.json?auth=$authToken'); try { final response = await http.get(url); final extractedData = json.decode(response.body) as Map<String, dynamic>; if (extractedData == null) { return; } url = Uri.parse( 'https://shopapp-bd154-default-rtdb.firebaseio.com/userFavorites/$userId.json?auth=$authToken'); final favoriteResponse = await http.get(url); final favoriteData = json.decode(favoriteResponse.body); final List<Product> loadedProducts = []; extractedData.forEach((prodId, prodData) { loadedProducts.add(Product( id: prodId, title: prodData['title'] ?? '', description: prodData['description'] ?? '', price: prodData['price'] ?? 0.0, imageUrl: prodData['imageUrl'] ?? '', isFavorite: favoriteData == null ? false : favoriteData[prodId] != null ? favoriteData[prodId]['isFavorite'] ?? false : false, )); }); _items = loadedProducts; notifyListeners(); } catch (error) { rethrow; } }
额外验证
Product模型的toggleFavoriteStatus方法写入Firebase的格式正确,使用json.encode({'isFavorite': isFavorite})与数据库结构匹配,无需修改。
内容的提问来源于stack exchange,提问作者Alden Sison Hernandez
相关产品推荐
相关产品推荐

