RangeError (RangeError (start): Invalid value: Not in inclusive range 0..2: -1)

2024. 10. 16. 03:12Flutter/error log

슈파베이스에 저장된 파일을 불러오는 과정에서 다음과 같은 에러가 발생했다.

 

검색해보니 인덱스 범위에 해당되지 않는 값을 이용하려고 할 때 발생하는 에러라고 한다.

 

예상했던 에러 발생 요인은 두 가지다.

1. 파일을 저장하는 리스트 안의 값이 없는 상태에서 UI에 파일을 반환하는 경우

2. 파일을 보여주는 과정에서 timestamp 값을 슬라이싱 하는데, 이때 슬라이싱이 잘못되어 -1을 반환하는 경우

 

1. 파일을 저장하는 리스트 안의 값이 없는 상태에서 UI에 파일을 반환하는 경우

UI도 잘 뜨고,

 

디버깅 했을 때 파일을 저장하는 리스트에도 값이 들어있는 것을 확인할 수 있었다.

 

2. 파일을 보여주는 과정에서 timestamp 값을 슬라이싱 하는데, 이때 슬라이싱이 잘못되어 -1을 반환하는 경우

슬라이싱의 문제일까 싶어 슬라이싱도 하지 않고, 혹시라도 값이 없을 경우를 대비해 예외 처리까지 해줬다.

하지만 동일하게 에러는 계속해서 발생했다.

 

 

사실 이 문제는 작업을 하던 오전까지만 해도 없던 문제였는데, 오후가 되자 갑자기 발생한 문제였다.

그렇다는 말은 코드 외부에서 문제가 발생했을 가능성이 있다는 뜻이다.

 

팀원들과 회의를 하던 중 슈파베이스에서 timestamp로 지정되어 있던 데이터 타입을 timestamptz로 바꿨던 것이 생각나, 다시 timestamp로 바꿔보았다.

음... 역시 동일하게 UI가 나오다가 중간에 멈추며 동일한 에러가 발생한다.

 

지금까지의 사실 :

1. 파일 불러오기는 잘 된다.

2. timestamp를 timestamptz로 바꾼 것은 문제가 아니었다.

3. UI가 나오다가 중간에 멈추며 에러가 발생한다.

4. 파일 확인창을 두 번 정도 이동하는 동안에는 파일이 존재하지 않는다는 UI가 뜨다가, 세 번째 파일 확인창을 클릭했을 때에는 UI가 완벽하지 않게 뜨며 에러가 발생한다.

 

코드를 들여다보다가, FutureBuilder를 사용한 것이 문제가 되지 않을까 싶었다.

현재 내 코드는 GetX 상태관리자를 통해 파일 리스트를 받아오고, RxList에 파일을 저장해 불러오는 식이었다.

파일 작성자의 이름을 받아오기 위해 비동기 함수를 작성했고, 비동기 함수의 반환값을 받아오기 위해 FutureBuilder를 사용했는데, 이 과정에서 지연이 발생했거나(파일 확인창을 두 번 정도 이동하는 동안에는 파일이 존재하지 않는다는 UI가 뜨는 경우), 무언가 다른 문제가 있는게 아닐까 하는 생각이 들었다.

 

혹시 몰라 파일명만 Text() 위젯에 담아 FutureBuilder 없이 for 반복문을 이용해 출력해보았다.

ListView(
  children: [
    for (var file in controller.inFiles)
      Text(file.fileName!)
  ]
)

결과는 에러 없이 잘 나온다!

 

역시 FutureBuilder의 문제였을까 싶어 위젯 형태로도 반환을 해보았다.

 

위젯에 넣어서 실행해본 결과, 에러가 발생했다.

문제는 다름아닌 위젯을 사용할 때 발생한다는 것을 알게 되었다.

 

그럼 어디가 문제인걸까?

 

처음에는 아무런 것도 안 뜨다가 다시 한 번 파일창을 클릭하면 파일이 뜬다.

 

무엇이 문제일까 코드를 보던 중, 시간을 슬라이싱 하는 과정에서 에러가 발생함을 알게 되었다.

 

문제는 시간을 슬라이싱하는 부분이었다!

날짜와 시간을 나누는 부분을 문자열 슬라이싱을 통해 진행했는데, 이 과정에서 잘못된 인덱스 위치가 반환되었을 때 오류가 발생했던 것이다.

결국 처음 예상했던 2. 파일을 보여주는 과정에서 timestamp 값을 슬라이싱 하는데, 이때 슬라이싱이 잘못되어 -1을 반환하는 경우 때문이었다.

 

코드에 예외처리까지 넣고 DateFormat을 통해 날짜와 시간을 분리했더니 해결되었다!

ListView(
  children: [
    for (var file in controller.inFiles)
      FileTile(
        fileName: file.fileName ?? 'Unknown',
        date: file.createdAt != null
            ? DateFormat('yyyy-MM-dd').format(
                DateTime.parse(file.createdAt!))
            : 'Unknown',
        time: file.createdAt != null
            ? DateFormat('HH:mm').format(
                DateTime.parse(file.createdAt!))
            : 'Unknown',
        name: file.author ?? 'Unknown',
      )
  ],
),

'Flutter > error log' 카테고리의 다른 글

zsh: command not found: adb  (2) 2024.10.24