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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:32:37