Applying a boolean operator on FutureOr<bool> as part of fold

Issue

I am trying to check whether a boolean value in Firestore is true for a list of documents.

On trying to compile the code below I keep on getting the error The argument type 'Future<bool> Function(bool, DocumentReference<Object?>)' can't be assigned to parameter type 'FutureOr<bool>'.

Future<bool> checkValInAllDocsIstrue(
  List<DocumentReference> docs
) async {
  return docs.fold(Future.value(true),
    (Future<bool> acc, doc) => doc.get().then((doc_) {
      Map<String, dynamic> fetchDoc = doc_.data() as Map<String, dynamic>;
            bool val = fetchDoc["val"];
            return acc.then((acc_) => acc_ && val);
    }, onError: (e) => Future.error(e))
  );
}

Googling, I understand that acc_ && val is cast to FutureOr<bool>, but I have no idea how to cast this to the required Future<bool>. Any help would be appreciated.

Unfortunately, I cannot change the signature of the function as this is a given.

Solution

I noticed that it works if I explicitly cast the return type as follows (with an additional code cleanup),

Future<bool> checkValInAllDocsIstrue(
  List<DocumentReference> docs
) async {
  return docs.fold(true,
    (bool acc, doc) => doc.get().then((doc_) =>
       acc && doc_.data()["val"], onError: (e) => Future.error(e))
  ) as bool;
}

I hope this helps other people.

Answered By – Stereo

Answer Checked By – Marie Seifert (FlutterFixes Admin)

Leave a Reply

Your email address will not be published. Required fields are marked *