init method Null safety

Future<void> init()

로그인 후와, 농장변경시에는 이 메소드를 호출하여 splashScreen을 처음부터 다시 런칭하는 효과를 얻습니다.

Implementation

Future<void> init() async {
  try {
    LogManager().addLog("SplashScreen init()", screen: runtimeType.toString());

    setState(() {
      initialized = false;
      launched = false;
      hasError = false;
      disableLaunch = false;
    });

    try {
      try {
        await _configureAmplify();
      } on AmplifyException catch (e) {
        LogManager().addLog(e.toString(), screen: runtimeType.toString());

        /// [AmplifyAlreadyConfiguredException] 예외는 여러 상황에서 발생할 수 있는 예외입니다.
        /// 해당 예외가 발생하더라도 로직 진행에는 문제가 없기 때문에
        /// 사용자 인증 오류 등 다른 오류일때만 rethrow합니다.
        if (!(e is AmplifyAlreadyConfiguredException)) rethrow;
      } catch (e) {
        LogManager().addLog(e.toString(), screen: runtimeType.toString());
      }

      ApiService().userState = Provider.of<UserState>(context, listen: false);
      await ApiService().fetchAuthSession();
      User? user = await ApiService().getCurrentUser();
      LogManager().addLog("_configureAmplify() 성공", screen: runtimeType.toString());
    } on AmplifyException catch (e) {
      LogManager().addLog("AmplifyException 발생", screen: runtimeType.toString());
      LogManager().addLog(e.message, screen: runtimeType.toString());

      /// SessionExpiredException은 처음 한번만 예외를 발생시키고
      /// 그 뒤로는 flutter 상에서는 오류를 던지지 않는것으로 추정됩니다.
      /// Android 네이티브 코드에서만 에러메시지가 출력되고 예외를 던지지 않는 것 같아
      /// [FarmLoadingScreen]에서 처리하던 로그아웃을 여기서 바로 처리하도록 합니다.
      if (e is SessionExpiredException) {
        disableLaunch = true;
        await ApiService().signOut();
        EventService().eventBus.fire(
              PopupEvent(
                type: PopupType.alert,
                action: PopupAction.show,
                data: {"title": "알림", "content": "세션이 만료되었습니다. 다시 로그인해주세요."},
                onClose: () {
                  Navigator.of(context, rootNavigator: true).pushNamed(EmptyScreen.routeName);
                  Navigator.of(context, rootNavigator: true).pushReplacementNamed(SignInScreen.routeName);
                  // throw e;
                },
              ),
            );
      }
      // rethrow;
    } catch (e) {
      LogManager().addLog("_configureAmplify() 실패 $e", screen: runtimeType.toString());
      rethrow;
    }

    try {
      await _checkAppVersion();
      LogManager().addLog("_checkAppVersion() 성공", screen: runtimeType.toString());
    } catch (e) {
      LogManager().addLog("_checkAppVersion() 실패 $e", screen: runtimeType.toString());
      rethrow;
    }

    try {
      await _configurePermission();
      LogManager().addLog("_configurePermission() 성공", screen: runtimeType.toString());
    } catch (e) {
      LogManager().addLog("_configurePermission() 실패 $e", screen: runtimeType.toString());
      rethrow;
    }

    setState(() {
      initialized = true;
    });
  } catch (e) {
    LogManager().addLog("SplashScreen: init() error $e", screen: runtimeType.toString());
    handleError();
  }
}