Create unified interfaces across dart:io and dart:html
Dart runs on the client, thanks to dart:html, and on the command line, thanks to dart:io. However, like oil and water, those two libraries just don't mix. Your web apps can't use dart:io, and your server apps can't use dart:html. Normally, this isn't a problem, because the two different targets are oh so very different. However, some concepts are common, such as Web sockets or HTTP requests. Wouldn't it be nice to have a unified interface to Web sockets that works with either dart:io or dart:html? I'll spare you the suspense: Yes!
This post shows you one strategy to design a high-level interface for functionality that exists in both dart:io and dart:html. While the Dart team has the concept of configurability on their radar, not much concrete action has happened. In the meantime, try this strategy and you too can experiment with unifying interfaces and APIs. Code reuse FTW!
(This post was inspired by Mark Bennett's original question who is trying to build a more unified Web Socket interface.)
Step 1: Create a library and an interface
Design the interface that unifies something from dart:html and dart:io.
library shared; abstract class BaseFoo { common(); }
Step 2: Implement the interface for dart:html
In another library, implement the interface with dart:html:
library html_thing; import 'dart:html'; import 'shared_interface.dart'; class Foo extends BaseFoo { common() { print('from html'); } }
Step 3: Implement the interface for dart:io
In another library, implement the interface with dart:io.
library io_thing; import 'dart:io'; import 'shared_interface.dart'; class Foo extends BaseFoo { common() { print('from io'); } }
Step 4: Package it up
All of the previous code can go into the same pub package.
Pick a library to use
The consumer of your pub package must decide which library to import. For example, a dart:io app might look like this:
import 'dart:io'; import 'package:sharedinterfacetest/io_version.dart'; main() { var foo = new Foo(); foo.common(); }
Hope that helps! All the code for this example is found at Github.