我很有趣的函数式编程。我需要折叠 Either 的值,但总是留下返回值。我无法弄清楚原因?左侧返回
- 左错误类型'Null'不是类型转换中'Object'类型的子类型
从其他条件返回的onErrorReturnWith 。
存储库的代码是:
Stream<Either<FireStoreServerFailures, List<Product>>>
fetchProducts() async* {
CollectionReference<Object?> _productsCollection =
_firebaseFirestore.productsCollection;
yield* _productsCollection.snapshots().map(
(snapshot) {
return right<FireStoreServerFailures, List<Product>>(snapshot.docs
.map((doc) => ProductDTO.fromFireStore(doc).toDomain())
.toList());
},
).onErrorReturnWith((error, stackTrace) {
if (error is FirebaseException) {
return left(FireStoreServerFailures.serverError(msg: "$error"));
} else {
// always emplemented
coloredPrint(msg: "Error");
return left(
FireStoreServerFailures.unexpectedError(msg: "Error $error"),
);
}
});
}
调用函数是:
goToProduct() async {
homeRepository.fetchProducts().listen((event) {
event.fold(
(l) => coloredPrint(msg: "left ${l.msg}", color: LogColors.green),
(r) => coloredPrint(msg: "right ${r.length}", color: LogColors.red),
);
});
}
数据传输对象是:
abstract class ProductDTO with _$ProductDTO {
factory ProductDTO({
@JsonKey(ignore: true) @Default("") String id,
required String title,
required num price,
required String description,
required List<String> images,
@FieldValueConverter() required FieldValue time,
// required List<Asset> pickedImages,
}) = _ProductDTO;
// Convert Peoduct to Product DTO
factory ProductDTO.fromDomain(
{required Product product, required DocumentReference<Object?> uid}) {
return ProductDTO(
// id: product.id,
// fetchProductsLeft(FireStoreServerFailures.unexpectedError(msg:
//Error type 'String' is not a subtype of type 'DocumentReference<Object?>'
//in type cast))
// uid: uid,
title: product.title.getOrCrash(),
price: num.parse(product.price.getOrCrash()),
description: product.description.getOrCrash(),
images: product.pickedImages.getOrCrash(),
time: FieldValue.serverTimestamp(),
);
}
// Fetching Data From DB
factory ProductDTO.fromFireStore(DocumentSnapshot doc) {
return ProductDTO.fromJson(doc.data() as Map<String, dynamic>)
.copyWith(id: doc.id);
}
factory ProductDTO.fromJson(Map<String, dynamic> json) =>
_$ProductDTOFromJson(json);
}
extension ProductDTOX on ProductDTO {
Product toDomain() {
return Product(
id: id,
// uid: uid,
title: ProductTitle(title: title),
price: Price(price: price.toString()),
description: Description(description: description),
pickedImages: ListOf5<String>(listOfPickedImages: images),
);
}
}