플러터는 다트로 만들어졌고, 다트는 단일 스레드 언어다. 즉, 플러터 앱은 한번에 한 가지 일만 할 수 있다.
이벤트 루프는 백그라운드에서 무한히 도는 루프로, 주기적으로 이벤트 큐에 들러 실행해야 할 작업이 있는지 확인한다. 실행할 작업이 있고 CPU가 아무 일도 하지 않고 있다면, 해당 작업을 실행 스택에 넣는다.
작업을 기다리고 있는 메인 스레드를 가로막을 가능성이 있는 명령이 있으면 명령을 시작한 뒤 "대기할" 부분을 별도의 큐에 넣는다.
CPU의 처리 속도와 상관없이 느린 작업이 있는데, 대표적인게 파일에서 읽는 작업과 HTTP 통신이다.
데이터 준비가 완료되면 Future을 사용할 수 있는데, then 함수를 통해 콜백 함수를 등록하고 콜백 함수가 Future 데이터를 처리한다.
then 함수와 비슷하게 await을 사용하면 데이터를 기다렸다가 받을 수 있다.
await을 사용하면 실행 중인 코드를 잠시 멈추고 다음 행으로 넘어가기 전에 Future의 완료를 기다린다.
함수 안에서 await를 사용하면 함수가 메인 스레드를 가로막을 위험이 있기 때문에 항상 함수를 async로 표기해서 비동기적으로 실행해야 한다.
async는 플러터의 build 메서드에는 사용할 수 없지만, onPress 같은 이벤트에는 사용할 수 있다. 따라서 비동기적인 작업은 이벤트로 돌리려고 노력해야 한다.