uni_links icon indicating copy to clipboard operation
uni_links copied to clipboard

Use `static final` instead of `static const` for token used with plugin_platform_interface

Open collinjackson opened this issue 3 years ago • 0 comments

Describe the bug This plugin should not use a const Object() as the platform interface token. There was an error in the documentation for plugin_platform_interface; see https://github.com/flutter/flutter/issues/96178.

The consequence is that someone could develop an implementation of UniLinksPlatform using implements instead of extends, and everything would work initially but changes to the platform interface would break that implementation.

To fix, use a static final Object _token = Object(); instead of static const Object _token = Object(); in UniLinksPlatform.

To Reproduce Steps to reproduce the behavior:

  1. Build a class that implements UniLinksPlatform instead of using extends. Use const Object() as the token. e.g.
class DontDoThis extends PlatformInterface implements UniLinksPlatform {
  DontDoThis(): super(token: const Object());
  ...
  static void registerWith(Registrar registrar) {
    UniLinksPlatform.instance = DontDoThis();
  }
}
  1. Make an app that depends on the new class and imports the file where it is defined.
  2. Make a minor change to UniLinksPlatform (adding a method).
  3. Compile error "DontDoThis is missing implementations for these members"

Expected behavior Should not be possible to build a class that implements UniLinksPlatform because UniLinksPlatform uses a token that can't be impersonated.

This can be done by changing the token to static final Object _token = Object().

Smartphone (please complete the following information): N/A (reproduces on web)

/cc @stuartmorgan

collinjackson avatar Jan 07 '22 20:01 collinjackson