Flutter의 Page Rendering Process (Frame Rendering) 아래와 같습니다.
Create an element (BuildContext)
initState
didChangeDependencies
Build
일단 페이지가 완성되고 나면(Build 완료) 다른 것을 그리게 할 수 있습니다. 만약에 initState 시점에 context를 이용해서 페이지에 무언가를 그리라고 호출 한다고 가정해보겠습니다. initState가 호출되는시점은 Page Rendering Process 도중입니다. 따라서 setState() 오류 혹은 markNeedsBuild()를 만나게 됩니다.
addPostFrameCallback이 메소드는 프레임 렌더링이 끝난 후에 콜백을 실행하도록 예약할 수 있게 해줍니다. 이는 애니메이션을 설정하거나, UI가 완전히 렌더링된 후에 어떤 작업을 수행해야 할 때 유용합니다.
...
class _CounterPageState extends State<CounterPage> {
int myCounter = 0;
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
context.read<Counter>().Increment();
myCounter = context.read<Counter>().counter + 10;
});
}
...
원하는 작업을 UI가 완전히 그려진 이후에 수행하려는 경우 유용합니다. 예를 들어, Snackbar를 표시하거나, 다이얼로그를 보여주거나, 다른 페이지로 이동하는 등의 작업을 수행할 수 있습니다. 이러한 작업은 일반적으로 UI가 완전히 로드된 후에만 수행할 수 있습니다.
1. // Future.delayed(Duration(seconds: 0) {})
void initState() {
super.initState();
Future.delayed(Duration(seconds: 0), () {
context.read<Counter>().Increment();
myCounter = context.read<Counter>().counter + 10;
});
}
2. // Future.microtask(() {})
void initState() {
super.initState();
Future.microtask(() {
context.read<Counter>().Increment();
myCounter = context.read<Counter>().counter + 10;
});
}
Flutter version 3.0으로 업그레이드 된 후 addPostFrameCallback method 호출 방식에 변화가 생겼습니다.
version 3.0 이전 (! operator 적용 필요)
WidgetsBinding.instance!.addPostFrameCallback((_) {});
version 3.0 이후 (! operator 적용 불필요)
WidgetsBinding.instance.addPostFrameCallback((_) {});