avioli / uni_links

Flutter plugin for accepting incoming links.
BSD 2-Clause "Simplified" License
563 stars 303 forks source link

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

Open collinjackson opened 2 years ago

collinjackson commented 2 years ago

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();
    }
    }
  2. Make an app that depends on the new class and imports the file where it is defined.
  3. Make a minor change to UniLinksPlatform (adding a method).
  4. 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