본문 바로가기
TIL

[TIL] .env 인식하지 못하는 오류

by chengzior 2024. 12. 23.

api 발급받아서 .env에 넣고 작업했는데 아래와 같은 오류가 발생

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] 
Unhandled Exception: Method doesn't allow unregistered callers 
(callers without established identity). 
Please use API Key or other form of API consumer identity to call this API.

문제 원인 : API KEY가 제대로 전달되지 않음

  final _model = GenerativeModel(

    model: 'gemini-1.5-flash',
    apiKey: const String.fromEnvironment('GEMINI_API_KEY'),
    
  );

아무래도 이 부분에 문제가 있는 것 같아서 api를 직접 입력해보기로 했다.

  final _model = GenerativeModel(

    model: 'gemini-1.5-flash',
    apiKey: '#####'

  );

 

 

 

그랬더니 제대로 출력이 됨...!!

 


 

그렇다면 아래의 방식에서 무엇이 문제일까..?

apiKey: const String.fromEnvironment('GEMINI_API_KEY'),

검색해보니 환경 변수를 명시적으로 전달하지 않으면, String.fromEnvironment는 항상 null을 반환한다고...

또한 String.fromEnvironment는 앱 빌드 시점에 전달된 환경 변수를 읽는 데 사용되는 반면, 
.env 파일은 런타임에 읽히는 파일.
이 둘의 동작 방식이 다르기 때문에
 String.fromEnvironment가 .env 파일을 읽을 수 없다고 한다.

튜터님 화면에서는 무리 없이 진행되었는데 이것 참 의문..

 


api key를 노출하지 않고 해결하기!

[해결방법] dotenv 사용하기

1. 패키지 추가

flutter pub add flutter_dotenv

2. yaml 파일에 추가

dependencies:
  flutter_dotenv: ^5.2.1
  assets:
    - .env

3. main 수정

void main() async{
  WidgetsFlutterBinding.ensureInitialized(); 
  await dotenv.load(fileName: ".env"); 
  runApp(ProviderScope(child: MyApp()));
}

4. view_model 수정

  final _model = GenerativeModel(

    model: 'gemini-1.5-flash',
    apiKey: dotenv.get("GEMINI_API_KEY"),

  );

[결과]

해결 완료!