Home > Software design >  Flutter future return type issue with async functions
Flutter future return type issue with async functions

Time:12-14

I have a weird error with my Flutter code involving a Future<T> return type. I have a fairly simple piece of code that makes a get request to the backend, and a .then clause to handle the return. Everything's fine, and as soon as I add onError to handle possible back error (namely 403/404 errors), I have an issue regarding the return type, quoting that Future<dynamic> can't be returned when I expect a Future<String?>, and that's in spite of onError always returning null.

Any idea how I can fix that behavior? Thanks in advance !

Code:

Future<String?> getUserStatus(String id) async {
    return requestManager.get("/users/$id/status")
        .then((response) {
          final dynamic userStatus =
              (response as Map<String, dynamic>)["status"];
          if (unsubStatus == null) {
            return Future.value();
          }
          return Future.value(userStatus.toString());
        }, one rror: (error) {
          print("An error occured when reading response : $error");
          return null;
    }).onError((error, stackTrace) => Future.value("NoStatus")); // I also tried to return null
  }

Error:

A value of type 'Future<dynamic>' can't be returned from an async function with return type 'Future<String?>'.
 - 'Future' is from 'dart:async'.
    }).onError((error, stackTrace) => Future.value("NoStatus"));

CodePudding user response:

I recommended using try bloc and await instead of using then and onError:

Future<String?> getUserStatus(String id) async {
    try {
      var response = await requestManager.get("/users/$id/status");
      final dynamic unsubStatus = (response as Map<String, dynamic>)["status"];
      if (unsubStatus == null) {
        return null;
      } else {
        return unsubStatus.toString();
      }
    } catch (e) {
      print("An error occured when reading response : $e");
      return null;
    }
  }

CodePudding user response:

  Future<String?> getUserStatus(String id) async {
    final result =await requestManager.get("/users/$id/status");
    final dynamic userStatus = (response as Map<String, dynamic>)["status"];
    if (unsubStatus == null) {
      return Future.value();
    }
    return Future.value(userStatus.toString());
  }
  • Related