Создание виджета во Flutter, когда статус ответа на вызов API равен ›400

Поэтому я пытаюсь вызвать REST API для входа здесь. Это в моем файле api_services.dart, где я вызываю все API для приложения.

api_services.dart

Future<User> loginUser(String email, String password) 
async {
    final response = await http.post(serverOauthUrl+'/token',
    headers: {
    HttpHeaders.AUTHORIZATION: "xxxx"
  },
  body: {
     "email":"$email",
     "password":"$password",
  }
);
print(response.statusCode);
final responseJson = json.decode(response.body);
return new User.fromJson(responseJson);
}

И есть два способа, которыми я могу вызвать этот метод loginUser() в своих файлах пользовательского интерфейса и получить ответ. Один использует метод then(), а другой использует FutureBuilder. Однако ни в одном из методов я не могу получить код состояния. Мой вариант использования заключается в том, что когда код состояния > 400, я создам виджет, который показывает сообщение об ошибке.

login_screen.dart

Код метода then():

_callLoginAPI(String email, String password){
  loginUser(userName, password, "password").then((response) {
        response.data.token;
       // want my status code here as well along with response data
    }
    else
    {
      //todo show something on error
    }
  }, onError: (error) {
    debugPrint(error.toString());
  });


}

Или с помощью FutureBuilder:

return new FutureBuilder<User>(

      future: loginUser(email, password),
      builder: (context, snapshot) {

        if (snapshot.hasData) {
          print(snapshot.data.token);
        } else if (snapshot.hasError) {
          print(snapshot.error);
          return new Text("${snapshot.error}");
        }
        return new CircularProgressIndicator();
      },
    );

Я хочу сделать что-то вроде этого

if(response.statusCode > 400)
   return new Text("Error"):</code>

person pblead26    schedule 25.06.2018    source источник


Ответы (2)


Благодаря @Thomas эта проблема решена. На самом деле было простым решением.

Добавление изменений в код для других новичков:

api_services.dart

Future<http.Response> loginUser(String email, String password) async {
  final response = await http.post(serverOauthUrl+
    '/token',
    headers: {
    HttpHeaders.AUTHORIZATION: "Basic xxx"
    },
    body: {
      "email":"$email",
      "password":"$password",
    }
  );

  return response;
}

Поэтому вместо пользователя я возвращаю объект http.Response, и теперь я могу получить всю необходимую информацию из файлов пользовательского интерфейса.

Как это:

final responseJson = json.decode(response.body);
      User user = User.fromJson(responseJson);
      print(user.userName);

Надеюсь, это поможет кому-то

person pblead26    schedule 25.06.2018

Почему вы не возвращаете объект Api Result вместо пользователя, который содержит код ошибки и пользователя? Затем вы можете создавать различные виджеты на вашем FutureBuilder в зависимости от кода состояния.

person Thomas    schedule 25.06.2018