작성
·
420
0
void checkToken() async {
final refreshToken = await storage.read(key: REFRESH_TOKEN_KEY);
final accessToken = await storage.read(key: ACCESS_TOKEN_KEY);
final dio = Dio();
try {
final resp = await dio.post(
'http://$ip/auth/token',
options: Options(
headers: {
'authorization': 'Bearer $refreshToken',
},
),
);
await storage.write(
key: ACCESS_TOKEN_KEY, value: resp.data['accessToken']);
// if (!mounted) return;
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(
builder: (_) => const RootTab(),
),
(route) => false);
} catch (e) {
print('e: $e');
// if (!mounted) return;
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(
builder: (_) => const LoginScreen(),
),
(route) => false); // 뒤로가기 버튼을 눌러도 다시 로그인 화면으로 돌아가지 않음
}
}
이 로직이 원래 잘됬는데
몇일 사용안하다가 다시키니까
dio.post 부분에서 401에러가 발생하는데
이는 만료된 refreshToken으로 요청해서 발생하는 에러로 예상했습니다.
그런데 try catch로 감쌋기때문에
catch아래 로그인스크린으로 이동하는 로직이 실행되어야 한다고 생각됬는데
예상과 다르게 그냥 앱은 먹통이되고 dio 패키지 내부로 이동되며 401에러를 표시합니다.
임시로 로그인스크린을 강제로 띄워서 다시 토큰을 발행해서 해결했습니다만
왜 이런 상황이 발생하는지 잘이해가 되지않아서 질문드립니다.
답변 1
0
안녕하세요!
현재 try..catch문을 추가한 부분은 정확한 위치가 맞습니다.
Dio를 포함한 대부분의 HTTP 요청 라이브러리들은 2xx 이외의 상태 코드를 받았을때 에러를 던지게 돼있습니다.
catch에 print() 코드가 잘 실행 되신다면 코드상 문제는 없습니다.
감사합니다!
아 원래 그런거였군요 알려주셔서 감사합니다
강의 내용도 너무 알차서 항상 잘 배우고 있습니다 감사합니다 좋은하루 되세요 !