[So.SSul] 위젯이 빌드되기 전 async 함수를 실행시켜 build를 넘어가기
업데이트:
오늘 개발하면서 막혔던 부분은 Stateful Widget에서 Callback 함수 initState가 호출될 때 로컬에서 데이터를 불러와서 데이터에 대해 판단한 다음 이 위젯을 빌드할 필요 없다는 판단이 내려지면(그냥 다음 화면으로 바로 넘어가도 되겠다는 판단이 내려지면) initState 자체에서 Navigator를 이용하여 바로 다음 위젯으로 넘어가게 하려고 하면서 생긴 문제다.
이 글에서의 문제와 다른 점은 이 글에서는 그래도 build 함수가 실행된 후에 Navigator가 실행되었다는 점이다.
어쨌든 새로 발생한 이 문제를 해결하기 위해서 두 가지 방법을 혼용하였다.
-
initState 내에서 실행될 비동기 함수를 미리 async modifier를 병기하여 구현한다. 이 함수 내에서 SharedPreference를 사용하여 로컬 데이터를 불러 오면 된다. 그리고 Navigator도 이 함수 안에서 실행하면 된다. 이 때 Navigator에서 바로 push나 pushReplacement 함수를 호출하기보다는 of(context)를 사용하여 가장 가까운 context를 알아서 불러 오게 한다. 위젯이 빌드 되기 전에는 context가 없어서 그런지 몰라도 다음 Route로 진행하지 못했다.
- 로컬에서 불러온 데이터를 저장할 변수를 클래스의(이 경우에는 Stateful Widget) 멤버 변수로 선언하지 않고 함수의 지역 변수로 선언하였다.
- 그리고 마지막으로 initState 함수의 body에 위에서 구현한 함수를 호출하면 끝이다.
우리 앱은 Native Splash 화면이 있고 그와 똑같이 생긴 non-native Splash가 있다. 이 가짜 Splash 화면의 initState에서 로그인 정보와 앱 첫 실행 여부를 불러와 튜토리얼 화면을 보여주든지 바로 로그인 하여 메인화면으로 넘어가든지 하는 분기를 구현한다.
댓글남기기