0

我很有趣的函数式编程。我需要折叠 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),
    );
  }
}
4

0 回答 0