날씨 api 를 받아와 화면에 표시하는 기능을 만들던 중, api key를 하드코딩으로 집어넣지 않고 별도의 파일로 관리하는 것이 좋겠다는 생각이 들었다.
별도의 파일로 관리하여 gitignore에 등록해주면 보안적인 측면도 신경 쓸 수 있고, 추후 사용하는 api의 엔드포인트나 key 가 변경되었을 때 유지보수도 편리해진다.
pubspec.yaml
dependencies:
flutter:
flutter_dotenv: ^5.0.2
flutter:
assets:
- assets/config/env
pubspec.yaml 파일의 flutter 항목 밑에 assets 이라는 키워드로 .env 파일을 추가해주었다.
assets/config 라는 디렉토리는 원래 존재하지 않는 디렉토리이기 때문에 새로 만들어 주었다..(임의로 지정)
.env
apiKey = 발급받은apikey
위에 작성한 assets/config 디렉토리 밑에 .env 파일을 생성해 apiKey를 입력해주었다.
main 을 async로 바꾼 후 dotenv의 경로 지정, 로드
import 'package:flutter_dotenv/flutter_dotenv.dart';
// DotEnv dotenv = DotEnv() is automatically called during import.
// If you want to load multiple dotenv files or name your dotenv object differently, you can do the following and import the singleton into the relavant files:
// DotEnv another_dotenv = DotEnv()
Future main() async {
// To load the .env file contents into dotenv.
await dotenv.load(fileName: "assets/config/.env");
//...runapp
}
사용하고자 하는 위치에서
import 'package:flutter_dotenv/flutter_dotenv.dart';
...
final String apiKey = dotenv.env['apiKey']!;
dotenv.env 라는 함수를 이용해 map data처럼 불러올 수 있다.
json파일로 저장해서 불러와 사용하는 방법도 있지만, dotenv라는 공식문서가 있어서 한 번 사용해 보았다. 초기 설정이 귀찮긴해도 fallback 등으로 null-safety도 신경쓸 수 있고, load 기능으로 여러 변수 병합도 가능해서 추후 다른 기능을 이용할 일이 있다면 json으로 정보 저장하는 형식보다 훨신 편할 것 같다.