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"),
);
[결과]
해결 완료!
'TIL' 카테고리의 다른 글
[TIL] 클린 아키텍처(Clean Architecture) (0) | 2024.12.24 |
---|---|
[TIL] git 브랜치 강제 병합 (1) | 2024.12.23 |
[TIL] Stateful Widget의 LifeCycle (0) | 2024.12.20 |
[TIL] pubspec.yaml: A dependency may only have one source. 오류 (0) | 2024.12.20 |
[TIL] GoRouter (0) | 2024.12.19 |