할 일 목록처럼 입력 한 개와 목록 한 개가 있는 앱을 목표로 삼으세요. 아래 순서는 이 사이트의 글을 “읽고 끝내기”보다 단계마다 결과를 확인하도록 연결한 학습 경로입니다.
이미 아는 단계는 완료 조건만 확인하고 건너뛰어도 됩니다. 막힌 단계에서 설치·코드·기기 설정을 한 번에 바꾸지 말고 오류 메시지와 바꾼 한 가지를 기록하세요.
환경을 먼저 실행하세요
설치가 끝났다는 것과 앱이 실행된다는 것은 다릅니다. 빈 프로젝트를 만들고 대상 기기에서 기본 화면이 나타나는지 확인합니다. Windows에서 iOS 빌드까지 해결하려고 하기보다 사용 가능한 플랫폼 한 가지부터 정하세요.
완료 조건: flutter doctor의 대상 도구와 flutter devices의 기기를 확인하고 기본 앱이 실행됩니다.
변수와 타입의 선택 기준을 만드세요
입력 문자열, 숫자, null이 섞이는 경계를 먼저 연습합니다. final은 값을 다시 대입하지 않는다는 뜻이고, 그 안의 컬렉션까지 변경 불가능하게 만드는 것은 아닙니다. dynamic이 필요한 이유를 설명할 수 없다면 명시적인 모델을 먼저 검토합니다.
완료 조건: 같은 값에 var·final·const를 적용한 차이와 null 처리 경로를 코드로 설명할 수 있습니다.
작은 데이터와 제어 흐름을 다루세요
할 일 세 개를 List에 넣고 빈 입력은 거부하며, 항목을 추가·완료·삭제하는 함수를 만듭니다. UI를 붙이기 전 빈 목록, 중복 입력, 없는 항목 처리부터 확인하세요. 반복 중 컬렉션을 수정하는 경우도 따로 확인합니다.
완료 조건: 빈 입력·정상 입력·반복 추가 각각의 결과를 예측하고 테스트합니다.
한 화면의 크기와 스크롤을 정하세요
Column과 Row로 구역을 나눈 뒤 목록에 실제 높이 제약을 줍니다. 화면이 넘친다고 shrinkWrap을 모든 목록에 추가하기보다, 부모가 허용한 높이와 스크롤을 누가 담당하는지 확인합니다.
완료 조건: 작은 화면에서도 목록과 버튼이 겹치지 않고 스크롤이 동작합니다.
입력·상태·화면 이동을 연결하세요
TextEditingController에서 입력을 읽고 검증한 뒤 목록을 갱신합니다. 화면을 나갈 때 controller를 정리하고, 비동기 작업이 완료될 때 이미 화면이 제거된 상황을 점검합니다. 탭이나 Drawer는 핵심 화면이 동작한 뒤 연결하세요.
완료 조건: 잘못된 입력을 막고, 목록을 갱신하며, 화면을 떠난 뒤 오류가 발생하지 않습니다.
실패 상태와 네트워크 경계를 확인하세요
API가 정상 JSON을 반환하는 경우뿐 아니라 네트워크 끊김, 늦은 응답, 빈 목록과 오류 응답도 별도 상태로 보여줍니다. 연결이 안 될 때는 에뮬레이터의 localhost와 개발 PC 주소부터 구분합니다.
완료 조건: 로딩·성공·실패가 구분되고, 재시도해도 중복 작업을 만들지 않습니다.
테스트와 릴리스 조건을 점검하세요
정적 분석, 입력 검증 테스트, 화면 테스트를 확인하고 release 빌드를 만듭니다. 로컬 실행과 스토어 배포는 다른 단계입니다. 서명·권한·앱 ID와 실제 설치·업데이트 동작은 배포 환경에서 추가로 확인해야 합니다.
완료 조건: 분석과 테스트 결과를 기록하고 release 빌드의 성공 여부를 확인합니다.
버전과 실행 환경 기록
글의 예제를 적용할 때 Flutter·Dart 버전, 운영체제, 대상 기기와 실제 실행한 명령을 기록하세요. 같은 코드라도 SDK·패키지·플랫폼 조건이 다르면 결과가 달라질 수 있습니다. 첫 앱의 구체적인 예제와 테스트 결과는 로드맵 글에서 확인할 수 있습니다.