🐛 [firebase_core] `FirebasePluginPlatform` should not extend `PlatformInterface`, `verifyExtends` is never called
Bug report
FirebasePluginPlatform contains dead code. It should be renamed to FirebasePlugin and should not extend PlatformInterface.
Reasoning:
FirebasePluginPlatform.verifyExtends is not ever called. There is no reason for FirebasePluginPlatform to be a PlatformInterface. Having it extend PlatformInterface is fragile because if a method were ever added to FirebasePluginPlatform or PlatformInterface, it could break compatibility with libraries that are using these classes with implements.
Steps to reproduce
class CustomFirebaseAppCheck implements FirebaseAppCheck {
CustomFirebaseAppCheck() { ... }
@override
final FirebaseApp app;
@override
Future<void> activate({String? webRecaptchaSiteKey}) { ... }
@override
Future<String?> getToken([bool? forceRefresh]) { ... }
@override
Future<void> setTokenAutoRefreshEnabled(bool isTokenAutoRefreshEnabled) { ... }
@override
Stream<String?> get onTokenChange { ... }
}
Everything would work initially, but minor updates such as new methods added to FirebasePluginPlatform would cause the plugin to fail to compile.
Expected behavior
- Remove
FirebasePluginPlatform.verifyExtends, which is dead code. -
FirebasePluginPlatformshould not extendPlatformInterface. Subclasses ofPlatformInterfaceare not part of the app-facing plugin interface. - Rename
FirebasePluginPlatformtoFirebasePlugin. (Optionally, provide a soft-deprecated compatibility shimFirebasePluginPlatformthat extendsFirebasePluginso that this isn't a breaking change.) Update every plugin's app-facing class to extend this newFirebasePluginclass. This is to make it clear that the class is exposed to apps, unlike platform classes.
Additional context
Related issues: https://github.com/firebase/flutterfire/issues/8095 https://github.com/firebase/flutterfire/issues/8096
/cc @russellwheatley
Hello @collinjackson For AppCheck the instance is only a getter
/// Returns an instance using the default [FirebaseApp].
static FirebaseAppCheck get instance {
_instance ??= FirebaseAppCheck._(app: Firebase.app());
return _instance!;
}
Moreover, the underlying FirebaseAppCheckPlatform is not exported from the user-facing package. I'm not sure if you used the correct package as an example?
I've updated the issue description to remove the part about instance. I think this is still a valid bug however. Please take another look.