본문 바로가기

Personal Posting/Flutter

assets에 외부 파일 등록 후 접근

assets에 json 파일을 저장 후 이를 접근해서 데이터를 읽어오는 기능을 구현했다.

Future<String> loadSupportLang() async {
  File file = File('assets/json/support_lang.json');
  return await file.readAsString();
}

디버깅 모드에서 문제없이 동작해서 별 신경을 쓰지 않고 있었는데, 릴리즈 빌드를 통해 생성된 exe 파일을 실행 시에는 계속해서 파일을 읽지 못하는 문제가 발생했다.

 

이를 해결하기 위해 yaml 파일의 json 경로도 여기저기 옮겨보고, flutter clean도 해보고, json 파일 형식도 권고하는대로 소문자로 바꿔보고 했으나 변하는 것도 없었고, 설상가상으로 검색능력의 한계인지, 구글링을 해도 연관되는 내용이 검색되지 않았다.

 

그래서 내가 요즘 쏠쏠하게 도움받고 계신 형님께 여쭤보았는데, 아니나 다를까 바로 원하는 답을 주셨다. ㅠㅠ

<코딩잘하면 다 형님>

요약하자면 File 클래스를 사용할 경우, 릴리즈 빌드에서 파일에 직접 액세스를 할 수 없다고 한다. 그래서 rootBundle을 사용하라고 추천해주고 있다. 따라서 코드가 아래와 같이 변경되었다.

import 'package:flutter/services.dart' show rootBundle;

Future<String> loadSupportLangJson() async {
  return await rootBundle.loadString('assets/json/support_lang.json');
}

위와 같이 수정하니 배포 버전에서도 정상적으로 동작하는 것을 확인할 수 있었다.

약간 허탈했지만 구글링을 하면서 다른 몰랐던 부분도 알게된 계기가 되어서 나름 보람있었던 이벤트(?)였다.