가비지 컬렉션, drawer로 인한 오류

자동 로그인 이후, 재로그인 시 발생 할 수 있는 오류 방지
김인범's avatar
Jan 18, 2025
가비지 컬렉션, drawer로 인한 오류
로그인, 로그아웃이 짧은 시간안에 반복될 경우
가비지 컬렉션으로 인한 재 로그인에 문제가 생길 수 있다.
 
이 문제는 수업을 하면서 발견된 문제로
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"); }
로그아웃 시 실행되는 메서드입니다.
  1. 화면 이동이 실행될 때,
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

taker