Durante a aula de Autorizando Requisições -> Mostrando entradas do usuário, me deparei com um erro que não foi tratado pelo Ricarth, então desenvolvi uma tratativa e vim compartilhar para quem possa ter encontrado o mesmo erro.
Durante essa aula desenvolvemos uma forma de verificar se o usuário está logado ou não usando as informações dele que salvamos localmente via SharedPreferences, logo se existe a combinação token-email-id salva, ele está logado e podemos pular a tela de login. Porém, existe um furo nessa lógica pois o token expira, e se ele estiver expirado ele continuará salvo localmente, o que causará com que o App pule a tela de login, porém não consiga realizar nenhuma requisição HTTP pois o token está expirado.
O que devemos fazer é, caso a requisição HTTP retorne erro com body "jwt expired", precisamos deletar essas informações do SharedPreferences e voltar pra tela de Login.
Essa foi a lógica que eu usei para fazer isso
No arquivo auth_service.dart, eu criei outra função similar a saveUserInfos, chamada deleteUserInfos
deleteUserInfos() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove("accessToken");
prefs.remove("id");
prefs.remove("email");
}
Com essa função pronta, eu chamei ela no journal_service.dart dentro do método getAll, primeiro eu verifico se o erro foi "jwt expired", se for, chamo o deleteUserInfos
Future<List<Journal>> getAll({required String id, required String token}) async {
http.Response response = await client.get(
Uri.parse(("${url}users/$id/journals")),
headers: {"Authorization": "Bearer $token"});
if (response.statusCode != 200) {
//Se token salvo localmente estiver expirado, deleta e volta pra tela de login
if (response.body.contains("jwt expired") ) {
AuthService auth = AuthService();
auth.deleteUserInfos();
}
throw Exception();
}
List<Journal> list = [];
List<dynamic> listDynamic = json.decode(response.body);
for (var jsonMap in listDynamic) {
list.add(Journal.fromMap(jsonMap));
}
return list;
}
Após isso, na próxima chamada do método refresh() o programa irá voltar pra tela de login ao invés de ficar preso na tela inicial porém não mostrando nada.
Deixando claro que isso não é uma crítica ao Ricarth, acredito que ele deixou esse caso passar batido porque no tempo que ele fez a aula o token não chegou a expirar então isso não aconteceu com ele, e acho que esses erros são bons para que a gente possa aprender a se virar sozinhos também kkkkkkk