繁体   English   中英

“未处理的异常:'String' 类型不是 'bool' 类型的子类型” ==TypeError

[英]"Unhandled Exception: type 'String' is not a subtype of type 'bool' " ==TypeError

当用户单击收藏图标时,我只想在 Firebase 中更新我最喜欢的状态。
一切都完成了:但是当我获取数据时,我得到了这个错误:
“未处理的异常:'String' 类型不是 'bool' 类型的子类型”
-isFavorite 是一个布尔值,我该怎么办?

在这里我得到了这个 Function 的错误:

  Future<void> fetchAndSetProducts() async {
var url =
    'https://ecommerce-test-753ad-default-rtdb.firebaseio.com/products.json?auth=$authToken';
try {
  final response = await http.get(Uri.parse(url));
  final extractedData = json.decode(response.body) as Map<String, dynamic>;
  if (extractedData == {}) {
    return;
  }
  url =
      'https://ecommerce-test-753ad-default-rtdb.firebaseio.com/userFavorites/$userId.json?auth=$authToken';
  final favoriteResponse = await http.get(Uri.parse(url));
  final favoriteData = json.decode(favoriteResponse.body);
  final List<Product> loadedProduct = [];
  extractedData.forEach((key, value) {
    loadedProduct.add(
      Product(
        id: key,
        title: value['title'],
        price: value['price'],
        imageUrl: value['imageUrl'],
        description: value['description'],
        isFavorite:
            favoriteData == null? false : favoriteData[key] ?? false,
      ),
    );
  });
  _productItems = loadedProduct;
  notifyListeners();
} catch (e) {
  rethrow;
}
}

这是产品 Model class:

class Product with ChangeNotifier {
 final String id;
 final String title;
 final double price;
 final String imageUrl;
 final String description;
 bool isFavorite;

 Product({
 required this.id,
 required this.title,
 required this.price,
 required this.imageUrl,
 required this.description,
 this.isFavorite = false,
  });


 void _setFavValue(bool newValue) {
  isFavorite = newValue;
  notifyListeners();
  }

Future<void> toggleFavoriteStatus(String authToken, String 
 userId) async {
  final oldStatus = isFavorite;
   isFavorite = !isFavorite;
  notifyListeners();
 final url =
     'https://ecommerce-test-753ad-default- 
rtdb.firebaseio.com/userFavorites/$userId/$id.json? 
auth=$authToken';
  try {
   final response = await http.put(
     Uri.parse(url),
    body: json.encode(isFavorite),
  );
  if (response.statusCode >= 400) {
    _setFavValue(oldStatus);
  }
} catch (error) {
  _setFavValue(oldStatus);
}
}

}

问题似乎是您从 Firebase 返回的favoriteData[key]值是String的形式,而不是您想要的bool形式。 添加这些行:

  extractedData.forEach((key, value) {

    // Two added lines:
    print('favoriteData[$key] is ${favoriteData[key]}');
    print('favoriteData[$key] is of type ${favoriteData[key].runtimeType}');

    loadedProduct.add(
      Product(
        id: key,
        title: value['title'],
        price: value['price'],
        imageUrl: value['imageUrl'],
        description: value['description'],
        isFavorite:
            favoriteData == null? false : favoriteData[key] ?? false,
      ),
    );

这将准确地告诉您该变量中的内容。 如果 output 是:

favoriteData[some_key] is true
favoriteData[some_key] is of type String

那么您就知道您不小心以 String 'true' 的形式上传了该值,而不是 bool 值true 也许你已经上传'$isFavorite'而不是isFavorite什么的......?

如果您发现该值完全包含其他内容,既不是“真”也不是“假”或“空”,那么您会从那里考虑下一步,希望 print() 能给您提供线索。 任何状况之下。


编辑:由于您似乎正在寻找快速修复,请尝试以下操作:

改变这个:

extractedData.forEach((key, value) {
    loadedProduct.add(
      Product(
        id: key,
        title: value['title'],
        price: value['price'],
        imageUrl: value['imageUrl'],
        description: value['description'],
        isFavorite:
            favoriteData == null? false : favoriteData[key] ?? false,
      ),
    );
  });

对此:

extractedData.forEach((key, value) {
    bool _isFavorite = favoriteData[key] != null && favoriteData[key] == 'true' ? true: false;
    loadedProduct.add(
      Product(
        id: key,
        title: value['title'],
        price: value['price'],
        imageUrl: value['imageUrl'],
        description: value['description'],
        isFavorite: _isFavorite,
      ),
    );
  });

至少这比其他答案更有可能起作用......如果你真的不能告诉我们你的favoriteData[key]值里面到底有什么!

正如您所提到的, favoriteData中的值是{-NAQTpO0QX4BEzkQaVdM: isFavorite}所以当您调用favoriteData[key]时,它会返回一个字符串'isFavorite' ,但是您的Product object 需要一个 bool 值,然后我们需要将字符串值转换为 bool使用下面的这种方法的价值。

改变这个:

extractedData.forEach((key, value) {
    loadedProduct.add(
      Product(
        id: key,
        title: value['title'],
        price: value['price'],
        imageUrl: value['imageUrl'],
        description: value['description'],
        isFavorite:
            favoriteData == null? false : favoriteData[key] ?? false,
      ),
    );
  });

对此:

extractedData.forEach((key, value) {
    var _isFavorite = favoriteData[key] != null && favoriteData[key] == 'isFavorite' ? true: false;
    loadedProduct.add(
      Product(
        id: key,
        title: value['title'],
        price: value['price'],
        imageUrl: value['imageUrl'],
        description: value['description'],
        isFavorite:
            favoriteData == null? false : _isFavorite,
      ),
    );
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM