skip to Main Content

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());
        }, onError: (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"));

2

Answers


  1. 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;
        }
      }
    
    Login or Signup to reply.
  2.   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());
      }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search