![](/img/trans.png)
[英]Unhandled Exception: type 'Null' is not a subtype of type 'BuildContext'
[英]"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.