Flutter后台服务管理插件flutter_daemon的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter后台服务管理插件flutter_daemon的使用

flutter_daemon 是一个围绕 Flutter 守护进程协议构建的可编程接口。它允许开发者通过 JSON-RPC 协议控制运行中的 Flutter 应用程序,并提供了强类型的 API 来与守护进程进行交互。

安装

首先,需要在 pubspec.yaml 文件中添加 flutter_daemon 作为依赖:

dependencies:
  flutter_daemon: ^最新版本号

然后在 Dart 文件中导入该包:

import 'package:flutter_daemon/flutter_daemon.dart';

使用

以下是一个简单的示例,展示如何启动并控制 Flutter 应用程序:

import 'package:flutter_daemon/flutter_daemon.dart';

void main() async {
  final daemon = FlutterDaemon();

  // 监听守护进程发出的事件
  daemon.events.listen((event) {
    print('Daemon event: $event');
  });

  // 运行一个 Flutter 应用
  final application = daemon.run(
    arguments: [
      '--target', 'lib/main.dart',
      '--flavor', 'development',
    ],
    workingDirectory: '/path/to/your/flutter/app/',
  );

  // 监听特定应用程序发出的事件
  application.events.listen((event) {
    print('Application event: $event');
  });

  // 重启应用
  await (await application).restart();
  print('Restarted the application.');

  // 分离应用但不终止它
  await (await application).detach();
  print('Detached from the application.');

  // 停止应用
  await (await application).stop();
  print('Stopped the application.');

  // 处理完后正确地释放资源
  await daemon.dispose();
  print('Disposed the daemon.');
}

调用服务扩展

你可以通过守护进程调用 Flutter 和 Dart 的服务扩展:

void main() async {
  final daemon = FlutterDaemon();

  final application = daemon.run(
    arguments: [
      '--target', 'lib/main.dart',
    ],
    workingDirectory: '/path/to/your/flutter/app/',
  );

  final response = await (await application).callServiceExtension('ext.myExtension.handler', {
    'some': 'parameters'
  });

  if (response.hasError) throw response.error;
  print('Service extension result: ${response.result}');
}

重用守护进程

一旦你运行或附加了一个应用程序,直到关闭当前进程之前,守护进程不能被重用:

void main() async {
  final daemon = FlutterDaemon();

  final application1 = daemon.run(
    arguments: [
      '--target', 'lib/main.dart',
    ],
    workingDirectory: '/path/to/your/flutter/app/',
  );

  // 如果你不关闭它并尝试再次运行或附加,它将抛出 StateError。
  await daemon.close();

  final application2 = daemon.attach(
    arguments: [
      '--target', 'lib/main.dart',
    ],
    workingDirectory: '/path/to/your/flutter/app/',
  );
}

确保在完全完成对守护进程的操作后正确地处理它:

await daemon.dispose();

示例代码

以下是一个完整的示例代码,展示了如何运行、重启和停止一个 Flutter 应用:

import 'package:flutter_daemon/flutter_daemon.dart';

/// 你可以使用以下命令运行这个示例:
/// ```sh
/// # 第一个参数必须是工作目录,其余为正常的 Flutter 参数。
/// dart example/main.dart ../path/to/flutter/app/ --target lib/main.dart --flavor development
/// ```
void main(List<String> arguments) async {
  final daemon = FlutterDaemon();
  daemon.events.listen(print);

  final workingDirectory = arguments.removeAt(0);
  final application = await daemon.run(
    arguments: arguments,
    workingDirectory: workingDirectory,
  );

  print('started');
  await Future<void>.delayed(const Duration(seconds: 10));

  print('restarting');
  print(await application.restart());
  await Future<void>.delayed(const Duration(seconds: 10));

  print('stopping');
  await application.stop();
  await daemon.dispose();
}

更多关于Flutter后台服务管理插件flutter_daemon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter后台服务管理插件flutter_daemon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,flutter_daemon并不是一个官方或广泛认知的用于后台服务管理的插件。通常,Flutter应用的后台服务管理涉及到与原生平台(iOS和Android)的交互,使用平台通道(Platform Channels)来实现特定功能。

不过,如果你的需求是与Flutter工具链中的守护进程(daemon)进行交互,管理Flutter设备的连接、构建和运行等操作,那么你可能需要直接与Flutter SDK的底层工具交互,这通常不是通过Flutter插件完成的,而是使用Dart的HTTP客户端或WebSocket客户端与Flutter的daemon服务进行通信。

以下是一个简化的示例,展示如何使用Dart的http包与Flutter的daemon服务进行基本的通信。请注意,这仅用于演示目的,实际使用时需要遵循Flutter daemon的API规范。

首先,确保你在pubspec.yaml文件中添加了http依赖:

dependencies:
  http: ^0.13.3  # 请使用最新版本

然后,你可以使用以下Dart代码与Flutter daemon进行通信:

import 'dart:convert';
import 'package:http/http.dart' as http;

void main() async {
  // Flutter daemon的默认端口是8101
  final Uri daemonUri = Uri.parse('http://localhost:8101');

  // 发送一个GET请求到daemon以获取设备列表
  final response = await http.get(Uri.parse('${daemonUri}/json'));

  if (response.statusCode == 200) {
    // 解析JSON响应
    final Map<String, dynamic> responseBody = jsonDecode(response.body);
    print('Daemon response: $responseBody');

    // 假设我们想要获取设备ID列表
    if (responseBody.containsKey('device')) {
      final List<Map<String, dynamic>> devices = responseBody['device'] as List<Map<String, dynamic>>;
      print('Connected devices:');
      for (final device in devices) {
        print(' - ${device['id']}: ${device['name']}');
      }
    } else {
      print('No devices connected.');
    }
  } else {
    print('Failed to retrieve device list from daemon. Status code: ${response.statusCode}');
  }
}

这个示例代码做了以下几件事:

  1. 定义了Flutter daemon的URI(通常是http://localhost:8101)。
  2. 使用http.get方法发送一个GET请求到daemon的/json端点,这个端点通常返回JSON格式的响应,包含了当前连接的设备信息。
  3. 解析响应的JSON数据,并打印出连接的设备列表。

请注意,这个示例非常基础,并且没有处理daemon通信中可能遇到的各种错误和边缘情况。在实际应用中,你可能需要更复杂的错误处理、重试逻辑以及更深入的daemon API使用。

如果你确实是在寻找一个用于Flutter后台服务管理的插件,你可能需要查看如workmanagerbackground_fetchflutter_background_service等插件,这些插件提供了在后台执行任务的能力,而不需要直接与Flutter daemon进行通信。

回到顶部