2024. 10. 16. 03:12ㆍFlutter/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 |
---|