inblog logo
|
taker
    플러터

    가비지 컬렉션, 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

    RSS·Powered by Inblog