watchChanges method
Stream<void>
watchChanges({
- Duration? debounce = const Duration(milliseconds: 200),
- List<
ChangeType> events = const [ChangeType.ADD, ChangeType.MODIFY, ChangeType.REMOVE], - List<
StoreParts> storeParts = StoreParts.values,
Watch for changes in the current store
Useful to update UI only when required, for example, in a StreamBuilder. Whenever this has an event, it is likely the other statistics will have changed.
Control which changes are caught through the events
parameter, which takes a list of ChangeTypes. Catches all change types by default.
Enable debouncing to prevent unnecessary events for small changes in detail using debounce
. Defaults to 200ms, or set to null to disable debouncing.
Debouncing example (dash roughly represents debounce
):
input: 1-2-3---4---5-6-|
output: ------3---4-----6|
Implementation
Stream<void> watchChanges({
Duration? debounce = const Duration(milliseconds: 200),
List<ChangeType> events = const [
ChangeType.ADD,
ChangeType.MODIFY,
ChangeType.REMOVE
],
List<StoreParts> storeParts = StoreParts.values,
}) {
Stream<void> constructStream(Directory dir) => FileSystemEntity
.isWatchSupported
? dir
.watch(
events: [
events.contains(ChangeType.ADD) ? FileSystemEvent.create : null,
events.contains(ChangeType.MODIFY)
? FileSystemEvent.modify
: null,
events.contains(ChangeType.MODIFY)
? FileSystemEvent.move
: null,
events.contains(ChangeType.REMOVE)
? FileSystemEvent.delete
: null,
].whereType<int>().reduce((v, e) => v | e),
)
.map<void>((e) {})
: DirectoryWatcher(dir.absolute.path)
.events
.where((evt) => events.contains(evt.type))
.map<void>((e) {});
final Stream<void> stream = constructStream(_access.real).mergeAll([
if (storeParts.contains(StoreParts.metadata))
constructStream(_access.metadata),
if (storeParts.contains(StoreParts.stats)) constructStream(_access.stats),
if (storeParts.contains(StoreParts.tiles)) constructStream(_access.tiles),
]);
return debounce == null ? stream : stream.debounce(debounce);
}