Flutter事件监听插件dispatch_source_watcher的使用

Flutter事件监听插件DispatchSourceWatcher的使用

DispatchSourceWatcher

一个使用iOS的DispatchSource API来提供有限文件系统监控的包。

特性

监听iOS上的文件系统事件。此插件旨在填补标准库中的空白,目前在iOS上不支持监视文件系统更改(参见flutter问题99456)。

使用

创建一个所需的路径的观察者:

final watcher = DispatchSourceWatcher(path: '/tmp/dir1');

观察者提供了一个可以监听的(广播)流:

final subscription = watcher.stream.listen((event) {
  print("接收事件,路径为 ${event.path}");
});

停止监听更改时取消订阅:

subscription.cancel();

限制

此包提供的通知数据粒度不高。特别是,当监视目录时,触发的事件不会包含目录层次结构中修改的文件的路径 - 事件中的路径是被监视的目录的路径。

需要iOS 10.0+版本。

完整示例代码

import 'dart:io';
import 'dart:async';
import 'package:flutter/material.dart';

import 'package:dispatch_source_watcher/dispatch_source_watcher.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final DispatchSourceWatcher watcher = DispatchSourceWatcher(path:'/tmp/dir1');
  StreamSubscription? watcherSubscription;

  @override
  void initState() {
    super.initState();
    Directory("/tmp/dir1").createSync(); // 创建测试目录
    watcherSubscription = watcher.stream.listen((event) => onFsEvent(event)); // 监听文件系统事件
  }

  @override
  void dispose() {
    watcherSubscription?.cancel(); // 取消订阅
    super.dispose();
  }

  void onFsEvent(DispatchSourceEvent event) {
    print("调试信息:flutter应用收到事件,路径为 ${event.path},事件名称为 ${event.eventNames}");
  }

  void writeFile() {
    final test2 = File('/tmp/dir1/test2'); // 测试文件路径
    if (test2.existsSync()) {
      test2.delete(); // 如果文件存在则删除
    }
    test2.writeAsStringSync('hello world'); // 写入内容到文件
    Directory('/tmp/dir1').deleteSync(recursive: true); // 删除目录
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
            child: TextButton(
                child: Text('在/tmp/dir1/创建文件'),
                onPressed: writeFile
            )
        ),
      ),
    );
  }
}

此示例代码展示了如何创建一个DispatchSourceWatcher并监听文件系统事件。当点击按钮时,会在指定目录下创建一个文件,并且会触发相应的文件系统事件。


更多关于Flutter事件监听插件dispatch_source_watcher的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter事件监听插件dispatch_source_watcher的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dispatch_source_watcher 是一个用于在 macOS 和 iOS 平台上监听文件系统事件的 Flutter 插件。它基于 Grand Central Dispatch (GCD)dispatch_source 机制,可以用来监控文件或目录的创建、删除、修改等事件。

使用步骤

  1. 添加依赖: 首先,在 pubspec.yaml 文件中添加 dispatch_source_watcher 插件的依赖。

    dependencies:
      flutter:
        sdk: flutter
      dispatch_source_watcher: ^0.0.1  # 版本号可能有所不同,请查看最新的版本
    
  2. 导入插件: 在需要使用的地方导入插件。

    import 'package:dispatch_source_watcher/dispatch_source_watcher.dart';
    
  3. 创建监听器: 使用 DispatchSourceWatcher 来创建监听器,并指定要监控的路径。

    final watcher = DispatchSourceWatcher(path: '/path/to/directory');
    
  4. 监听事件: 监听文件系统事件,并在事件发生时执行相应的操作。

    watcher.events.listen((event) {
      print('Event type: ${event.type}');
      print('Event path: ${event.path}');
    });
    
  5. 启动监听器: 调用 start 方法来启动监听。

    watcher.start();
    
  6. 停止监听器: 在不需再监听时,调用 stop 方法来停止监听。

    watcher.stop();
    

事件类型

DispatchSourceWatcher 支持监听多种文件系统事件,常见的事件类型包括:

  • DispatchSourceEventType.created: 文件或目录被创建。
  • DispatchSourceEventType.deleted: 文件或目录被删除。
  • DispatchSourceEventType.modified: 文件或目录被修改。
  • DispatchSourceEventType.renamed: 文件或目录被重命名。

示例代码

以下是一个完整的示例代码,展示了如何使用 dispatch_source_watcher 插件来监听指定目录的文件系统事件。

import 'package:flutter/material.dart';
import 'package:dispatch_source_watcher/dispatch_source_watcher.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FileWatcherExample(),
    );
  }
}

class FileWatcherExample extends StatefulWidget {
  [@override](/user/override)
  _FileWatcherExampleState createState() => _FileWatcherExampleState();
}

class _FileWatcherExampleState extends State<FileWatcherExample> {
  late DispatchSourceWatcher watcher;

  [@override](/user/override)
  void initState() {
    super.initState();
    watcher = DispatchSourceWatcher(path: '/path/to/directory');
    watcher.events.listen((event) {
      print('Event type: ${event.type}');
      print('Event path: ${event.path}');
    });
    watcher.start();
  }

  [@override](/user/override)
  void dispose() {
    watcher.stop();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Watcher Example'),
      ),
      body: Center(
        child: Text('Watching directory changes...'),
      ),
    );
  }
}
回到顶部