Создание виджета во Flutter, когда statusCode ответа на вызов API> 400 - PullRequest
0 голосов
/ 25 июня 2018

Итак, я пытаюсь вызвать 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>

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Благодаря @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);

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

0 голосов
/ 25 июня 2018

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

...