watch static method

Future<ReloadFileWatcher> watch({
  1. required ReloadController controller,
  2. required Iterable<String> roots,
  3. ReloadMode mode = ReloadMode.reload,
  4. Duration debounce = const Duration(milliseconds: 150),
  5. bool recursive = true,
  6. bool ignoreHidden = true,
  7. Iterable<String> extensions = const <String>[],
})

Creates and starts a filesystem-backed watcher.

Implementation

static Future<ReloadFileWatcher> watch({
  required ReloadController controller,
  required Iterable<String> roots,
  ReloadMode mode = ReloadMode.reload,
  Duration debounce = const Duration(milliseconds: 150),
  bool recursive = true,
  bool ignoreHidden = true,
  Iterable<String> extensions = const <String>[],
}) async {
  final normalizedRoots = roots
      .map((root) => Directory(root).absolute.path)
      .toSet()
      .toList()
    ..sort();

  if (normalizedRoots.isEmpty) {
    throw ArgumentError.value(roots, 'roots', 'At least one watch root is required.');
  }

  final normalizedExtensions = extensions
      .map((extension) => extension.trim().toLowerCase())
      .where((extension) => extension.isNotEmpty)
      .map((extension) => extension.startsWith('.') ? extension : '.$extension')
      .toSet();

  final subscriptions = <StreamSubscription<FileSystemEvent>>[];
  final watcher = ReloadFileWatcher._(
    controller: controller,
    mode: mode,
    debounce: debounce,
    recursive: recursive,
    ignoreHidden: ignoreHidden,
    extensions: normalizedExtensions,
    roots: normalizedRoots,
    subscriptions: subscriptions,
  );

  for (final root in normalizedRoots) {
    final directory = Directory(root);
    if (!await directory.exists()) {
      throw ArgumentError.value(root, 'roots', 'Watch root does not exist.');
    }
    subscriptions.add(
      directory.watch(recursive: recursive).listen(
        watcher._handleEvent,
        cancelOnError: false,
      ),
    );
  }

  return watcher;
}