init method Null safety
로그인 후와, 농장변경시에는 이 메소드를 호출하여 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();
}
}