Repository navigation
feat(firebase-ai-logic-basics): update Flutter SDK setup and add App Check guide - #221
AustinBenoit wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
Code Review
This pull request updates the Firebase AI Logic Flutter Setup Guide to reflect the renamed SDK, update installation and initialization instructions, and add detailed guidance on App Check integration, replay protection, and debug providers. The review feedback highlights several critical API mismatches in the provided Dart code examples: Firebase.initializeApp() should include DefaultFirebaseOptions.currentPlatform for cross-platform compatibility, and the FirebaseAppCheck.activate() configuration needs to be corrected to use the actual androidProvider, appleProvider, and webProvider parameters with their corresponding enums instead of non-existent provider classes.
| import 'package:firebase_core/firebase_core.dart'; | ||
| import 'package:firebase_auth/firebase_auth.dart'; | ||
| import 'package:firebase_ai/firebase_ai.dart'; | ||
| import 'package:flutter/material.dart'; | ||
|
|
||
| void main() async { | ||
| WidgetsFlutterBinding.ensureInitialized(); | ||
| await Firebase.initializeApp(); | ||
| await FirebaseAuth.instance.signInAnonymously(); | ||
| runApp(const MyApp()); | ||
| } |
There was a problem hiding this comment.
To align with the CLI-first approach and the note above about using flutterfire configure strictly for generating firebase_options.dart, we should import firebase_options.dart and pass options: DefaultFirebaseOptions.currentPlatform to Firebase.initializeApp(). Otherwise, initialization will fail on platforms like Web or if native configuration files are not manually integrated.
| import 'package:firebase_core/firebase_core.dart'; | |
| import 'package:firebase_auth/firebase_auth.dart'; | |
| import 'package:firebase_ai/firebase_ai.dart'; | |
| import 'package:flutter/material.dart'; | |
| void main() async { | |
| WidgetsFlutterBinding.ensureInitialized(); | |
| await Firebase.initializeApp(); | |
| await FirebaseAuth.instance.signInAnonymously(); | |
| runApp(const MyApp()); | |
| } | |
| import 'package:firebase_core/firebase_core.dart'; | |
| import 'package:firebase_ai/firebase_ai.dart'; | |
| import 'package:flutter/material.dart'; | |
| import 'firebase_options.dart'; | |
| void main() async { | |
| WidgetsFlutterBinding.ensureInitialized(); | |
| await Firebase.initializeApp( | |
| options: DefaultFirebaseOptions.currentPlatform, | |
| ); | |
| runApp(const MyApp()); | |
| } |
| import 'package:firebase_app_check/firebase_app_check.dart'; | ||
| import 'package:firebase_core/firebase_core.dart'; | ||
| import 'package:flutter/material.dart'; | ||
|
|
||
| Future<void> main() async { | ||
| WidgetsFlutterBinding.ensureInitialized(); | ||
| await Firebase.initializeApp(); | ||
| await FirebaseAppCheck.instance.activate( | ||
| // Android: Play Integrity (production) or AndroidDebugProvider() (development) | ||
| providerAndroid: const AndroidPlayIntegrityProvider(), | ||
| // iOS/macOS: AppleAppAttestProvider(), AppleDeviceCheckProvider(), | ||
| // AppleAppAttestWithDeviceCheckFallbackProvider(), or AppleDebugProvider() (development) | ||
| providerApple: const AppleAppAttestProvider(), | ||
| // Web: reCAPTCHA Enterprise (recommended) or ReCaptchaV3Provider | ||
| providerWeb: ReCaptchaEnterpriseProvider('recaptcha-enterprise-site-key'), | ||
| ); | ||
| runApp(const MyApp()); | ||
| } |
There was a problem hiding this comment.
In Flutter's firebase_app_check package, the parameters for activate() are androidProvider, appleProvider, and webProvider (not providerAndroid, providerApple, providerWeb). Additionally, for Android and iOS, the method expects AndroidProvider and AppleProvider enums rather than class instances like AndroidPlayIntegrityProvider or AppleAppAttestProvider. Also, we should pass options: DefaultFirebaseOptions.currentPlatform to Firebase.initializeApp() here as well.
| import 'package:firebase_app_check/firebase_app_check.dart'; | |
| import 'package:firebase_core/firebase_core.dart'; | |
| import 'package:flutter/material.dart'; | |
| Future<void> main() async { | |
| WidgetsFlutterBinding.ensureInitialized(); | |
| await Firebase.initializeApp(); | |
| await FirebaseAppCheck.instance.activate( | |
| // Android: Play Integrity (production) or AndroidDebugProvider() (development) | |
| providerAndroid: const AndroidPlayIntegrityProvider(), | |
| // iOS/macOS: AppleAppAttestProvider(), AppleDeviceCheckProvider(), | |
| // AppleAppAttestWithDeviceCheckFallbackProvider(), or AppleDebugProvider() (development) | |
| providerApple: const AppleAppAttestProvider(), | |
| // Web: reCAPTCHA Enterprise (recommended) or ReCaptchaV3Provider | |
| providerWeb: ReCaptchaEnterpriseProvider('recaptcha-enterprise-site-key'), | |
| ); | |
| runApp(const MyApp()); | |
| } | |
| import 'package:firebase_app_check/firebase_app_check.dart'; | |
| import 'package:firebase_core/firebase_core.dart'; | |
| import 'package:flutter/material.dart'; | |
| import 'firebase_options.dart'; | |
| Future<void> main() async { | |
| WidgetsFlutterBinding.ensureInitialized(); | |
| await Firebase.initializeApp( | |
| options: DefaultFirebaseOptions.currentPlatform, | |
| ); | |
| await FirebaseAppCheck.instance.activate( | |
| // Android: Play Integrity (production) or AndroidProvider.debug (development) | |
| androidProvider: AndroidProvider.playIntegrity, | |
| // iOS/macOS: AppleProvider.appAttest, AppleProvider.deviceCheck, or AppleProvider.debug (development) | |
| appleProvider: AppleProvider.appAttest, | |
| // Web: reCAPTCHA Enterprise (recommended) or ReCaptchaV3Provider | |
| webProvider: ReCaptchaEnterpriseProvider('recaptcha-enterprise-site-key'), | |
| ); | |
| runApp(const MyApp()); | |
| } |
| await FirebaseAppCheck.instance.activate( | ||
| providerAndroid: kDebugMode | ||
| ? AndroidDebugProvider(debugToken: stableDebugToken) | ||
| : const AndroidPlayIntegrityProvider(), | ||
| providerApple: kDebugMode | ||
| ? AppleDebugProvider(debugToken: stableDebugToken) | ||
| : const AppleAppAttestProvider(), | ||
| providerWeb: kDebugMode | ||
| ? WebDebugProvider(debugToken: stableDebugToken) | ||
| : ReCaptchaEnterpriseProvider('recaptcha-enterprise-site-key'), | ||
| ); |
There was a problem hiding this comment.
In Flutter's firebase_app_check package, there are no AndroidDebugProvider, AppleDebugProvider, or WebDebugProvider classes that accept a debugToken parameter in Dart. Instead, use the AndroidProvider.debug and AppleProvider.debug enums, and WebDebugProvider() for Web. The debug token itself is printed to the console/logs on first run or configured via native environment variables/build setups, rather than passed programmatically in Dart.
| await FirebaseAppCheck.instance.activate( | |
| providerAndroid: kDebugMode | |
| ? AndroidDebugProvider(debugToken: stableDebugToken) | |
| : const AndroidPlayIntegrityProvider(), | |
| providerApple: kDebugMode | |
| ? AppleDebugProvider(debugToken: stableDebugToken) | |
| : const AppleAppAttestProvider(), | |
| providerWeb: kDebugMode | |
| ? WebDebugProvider(debugToken: stableDebugToken) | |
| : ReCaptchaEnterpriseProvider('recaptcha-enterprise-site-key'), | |
| ); | |
| await FirebaseAppCheck.instance.activate( | |
| androidProvider: kDebugMode | |
| ? AndroidProvider.debug | |
| : AndroidProvider.playIntegrity, | |
| appleProvider: kDebugMode | |
| ? AppleProvider.debug | |
| : AppleProvider.appAttest, | |
| webProvider: kDebugMode | |
| ? WebDebugProvider() | |
| : ReCaptchaEnterpriseProvider('recaptcha-enterprise-site-key'), | |
| ); |
Summary
references/sdk/setup/flutter_setup.mdforfirebase_aiv4.0.0+ (FirebaseAI.googleAI(useLimitedUseAppCheckTokens: true)/FirebaseAI.agentPlatform()) and adds full Flutter App Check setup (providerAndroid,providerApple,providerWeb, and--dart-defineCI debug tokens).