로그인, 로그아웃이 짧은 시간안에 반복될 경우
가비지 컬렉션으로 인한 재 로그인에 문제가 생길 수 있다.
이 문제는 수업을 하면서 발견된 문제로
drawer context와 RefreshController가 남아있게 되면서
재 로그인 시 어플이 터지는 문제가 있었다.
Future<void> logout() async {
// 1. 디바이스 토큰 삭제
await secureStorage.delete(key: "accessToken");
// 2. 상태 갱신
state = SessionUser();
// 3. dio 갱신
dio.options.headers["Authorization"] = "";
// 4. 화면 이동
Navigator.popAndPushNamed(mContext, "/login");
}
로그아웃 시 실행되는 메서드입니다.
- 화면 이동이 실행될 때,
popAndPushNamed를 통해 해당 화면의 컨텍스트를 파괴하고,
로그인 페이지로 이동하게 되는데,
이때 파괴되는 컨텍스트(mContext)가 post_list의 컨텍스트가 아닌
drawer의 컨텍스트로 로그아웃을 해도, post_list가 남아있게 되어,
재 로그인을 할 때, 어플이 터지는 이유 중 하나였습니다.
해결법
화면을 전부 파괴하고, loginPage로 이동할 수 있게 수정하면 됩니다.
Future<void> logout() async {
// 1. 디바이스 토큰 삭제
await secureStorage.delete(key: "accessToken");
// 2. 상태 갱신
state = SessionUser();
// 3. dio 갱신
dio.options.headers["Authorization"] = "";
// 화면 다 파괴하고, LoginPage로 이동한다. << refresh 컨트롤러도 삭제되어서 문제 발생처리 됨
Navigator.pushNamedAndRemoveUntil(mContext, "/login", (route) => false);
}
pushNamedAndRemoveUtil 을 사용해서
drawer 컨텍스트랑 함께 post_list 컨텍스트도 파괴되게끔 하여,
모든 컨텍스트를 삭제할 수 있습니다.
남은 문제점
가비지 컬렉션으로 남게되는 refresh 컨트롤러가 있는데
이것도 pushNamedAndRemoveUtil 을 통해 함께 사라지게 되어,
문제점을 해결할 수 있게 되었습니다.
Share article