Make ForwardingDirectory generic. (#74)

Due to an upcoming change in Dart 2.0
(, it will no longer be
allowed for a class to implement the same generic interface in
different ways.  (E.g. a class cannot implement/extend/mixin both
A<int> and A<String>).

This causes problems with _LocalDirectory.  It extends
_LocalFileSystemEntity<_LocalDirectory, Directory>, which extends
ForwardingFileSystemEntity<_LocalDirectory, Directory>, but it mixes
in ForwardingDirectory, which extends
ForwardingFileSystemEntity<Directory, io.Directory>.

The solution is to make ForwardingDirectory a generic mixin, with
ForwardingDirectory<T> extending ForwardingFileSystemEntity<T,
io.Directory>.  Type inference automatically fills in the type
argument T=_LocalDirectory at the site of the declaration of
1 file changed
tree: 4c32b387711415041355f74fe5cf1974fad3f0bb
  1. contrib/
  2. lib/
  3. test/
  4. .analysis_options
  5. .gitignore
  6. .travis.yml
  7. appveyor.yml
  10. pubspec.yaml

Build Status


A generic file system abstraction for Dart.

Like dart:io, package:file supplies a rich Dart-idiomatic API for accessing a file system.

Unlike dart:io, package:file:

  • Can be used to implement custom file systems.
  • Comes with an in-memory implementation out-of-the-box, making it super-easy to test code that works with the file system.
  • Allows using multiple file systems simultaneously. A file system is a first-class object. Instantiate however many you want and use them all.


Implement your own custom file system:

import 'package:file/file.dart';

class FooBarFileSystem implements FileSystem { ... }

Use the in-memory file system:

import 'package:file/memory.dart';

var fs = new MemoryFileSystem();

Use the local file system (requires dart:io access):

import 'package:file/local.dart';

var fs = const LocalFileSystem();