簡體   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