본문 바로가기
TIL

기차표 예매 앱 만들기

by chengzior 2024. 11. 18.

기차표 예매하는 앱 구현

  • 구현해야 하는 기본 기능

1. 출발역과 도착역 선택
2. 좌석 선택
3. 예매하기
4. 역 선택하지 않았다면 예매하기 버튼 비활성화

 

  • 프로젝트 구성

- HomePage : 기본 페이지

-stationListPage : 출발역, 도착역 선택 페이지

-seatPage : 좌석 선택 페이지 

 

  • 오류와 해결 방법

 

1.

════════ Exception caught by widgets library ═══════════════════════════════════
Incorrect use of ParentDataWidget.
════════════════════════════════════════════════════════════════════════════════

뜬금없이 이런 오류가 발생.
위젯 트리 내에서 부모 위젯의 요구 사항에 맞지 않게 자식 위젯을 배치했을 때 발생하는 오류.
내 코드를 살펴보니 Expanded 위젯이 Column, Row, Flex 위젯 내에 위치하지 않아서 뜬 오류였다.
Body에 바로 Expanded로 감싸준 컬럼을 배치해서 그런 것. 삭제해주니 원활하게 돌아갔다.

 

2.

The body might complete normally, causing 'null' to be returned, but the return type, 'Widget', is a potentially non-nullable type.
Try adding either a return or a throw statement at the end.

도전 기능 중 사용자가 선택한 역을 리스트에서 제외하기 위해
위젯을 따로 작성했더니 오류가 발생했다.
함수 안에서 모든 조건에 대해 반환값을 보장하지 않아서 발생하는 오류라고 한다.

List<String> stationList = ['수서','동탄','평택지제','천안아산','오송','대전','김천구미','동대구','경주','울산','부산'];

  Widget createStation(){
    try{
      for(String name in stationList){
      return stationName('$name', context);
      }
    return Divider(color: Colors.grey[300],thickness: 0.3,);

    }catch(e) {
      print('An error occurred: $e');
      return Divider(color: Colors.grey[300],thickness: 0.3,);
    }
  }

일단은 이렇게 고쳐서 에러 해결은 했는데
리스트의 값 중 첫번째값만 표시되는 문제가 발생했다.

작성한 코드를 다시 보니 한 번의 실행 후에 바로 return 하고 있었다.

for(String name in stationList){
        stationWidgets.add(stationName('$name', context));
        stationWidgets.add(Divider(color: Colors.grey[300], thickness: 0.3));
      }

문제를 해결하기 위해
반복문을 돌며 역 이름을 위젯 리스트에 추가하여 한번에 위젯을 반환해주는 코드로 변경하였다.

//이미 선택된 역 리스트에서 제외하기
      if(widget.isdeparture==true){
        stationList.remove(widget.arrival);
        if(!stationList.contains(widget.departure)){
          stationList.add(widget.departure);
        }
      }else if(widget.isdeparture==false){
        stationList.remove(widget.departure);
        if(!stationList.contains(widget.arrival)){
          stationList.add(widget.arrival);
        }
      }

pop을 할 때 homepage와 주고받는 데이터를 활용해서
리스트에서 선택된 역은 제거해주는 코드를 작성했다.

 

3. 

지난 과제 피드백에서 부족했던 부분으로 커밋 컨벤션에 대해 좀 더 알아보고
익숙해지는 것을 조언 받았는데 깜빡 잊고 내 멋대로 커밋하고 있었다.

늦었지만 커밋 컨벤션에 대해 찾아보고 적용해보고 있는 중.

커밋 메시지는 3부분으로 구성된다


1. type
- 제목 
- 형태: type(scope): subject
- type의 종류:
    feat: 새로운 기능, 특징 추가
    fix: 수정, 버그 수정
    docs: 문서에 관련된 내용, 문서 수정
    style: 코드 포맷, 세미콜론 누락, 코드 변경이 없을 경우
    refactor: 리팩토링
    test: 테스트 코드 수정, 누락된 테스트를 추가할 때, 리팩토링 테스트 추가
    chore: 빌드 업무 수정, 패키지 매니저 수정


2.body: 
- 커밋에 대한 설명을 자세히 하는 부분

3. footer: 
- 추가사항, 이슈트래커 ID를 작성 

'TIL' 카테고리의 다른 글

[TIL] 동적계획법  (0) 2024.11.20
[TIL] 이진트리  (0) 2024.11.19
[TIL] 리스트 압축  (2) 2024.11.12
[TIL]플러터 기초  (0) 2024.11.11
[TIL] 과제 보충  (1) 2024.11.08