blob: 1b1f80425f76d74eba93d823ba4d8ce37d98fad2 [file] [log] [blame] [view]
# plugin_platform_interface
This package provides a base class for platform interfaces of [federated flutter plugins](https://flutter.dev/go/federated-plugins).
Platform implementations should extend their platform interface classes rather than implement it as
newly added methods to platform interfaces are not considered as breaking changes. Extending a platform
interface ensures that subclasses will get the default implementations from the base class, while
platform implementations that `implements` their platform interface will be broken by newly added methods.
This class package provides common functionality for platform interface to enforce that they are extended
and not implemented.
## Sample usage:
```dart
abstract class UrlLauncherPlatform extends PlatformInterface {
UrlLauncherPlatform() : super(token: _token);
static UrlLauncherPlatform _instance = MethodChannelUrlLauncher();
static final Object _token = Object();
static UrlLauncherPlatform get instance => _instance;
/// Platform-specific plugins should set this with their own platform-specific
/// class that extends [UrlLauncherPlatform] when they register themselves.
static set instance(UrlLauncherPlatform instance) {
PlatformInterface.verify(instance, _token);
_instance = instance;
}
}
```
This guarantees that UrlLauncherPlatform.instance cannot be set to an object that `implements`
UrlLauncherPlatform (it can only be set to an object that `extends` UrlLauncherPlatform).
## Mocking or faking platform interfaces
Test implementations of platform interfaces, such as those using `mockito`'s
`Mock` or `test`'s `Fake`, will fail the verification done by `verify`.
This package provides a `MockPlatformInterfaceMixin` which can be used in test
code only to disable the `extends` enforcement.
For example, a Mockito mock of a platform interface can be created with:
```dart
class UrlLauncherPlatformMock extends Mock
with MockPlatformInterfaceMixin
implements UrlLauncherPlatform {}
```