[英]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.