搜索插件、代码仓与 APP 分类

插件详情v0.8.0

dbus

D-Bus 消息总线客户端的原生 Dart 实现。该包允许 Dart 应用程序直接访问 Linux 桌面服务。

WindowsLinux
近 30 天下载
854万
喜欢数
80
Pub 分数
160

安装插件

flutter pub add dbus

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

D-Bus 消息总线客户端的原生 Dart 实现,使 Dart 应用程序能够直接与 Linux 桌面服务通信。此包提供对 D-Bus 的低级别访问,允许与会话管理、硬件事件和桌面集成等系统和服务进行交互。该库专为在 Linux 上构建桌面应用程序的开发者设计,并通过兼容的 D-Bus 实现支持 Windows 和 macOS。该库提供了简洁的、原生 Dart API,用于通过 D-Bus 发送和接收消息。

适合场景

  • 与 Linux 系统服务交互
  • 在Dart应用中集成桌面功能
  • 访问硬件和会话事件
  • 构建跨平台桌面工具
  • 启用与其他桌面应用程序的通信

主要特点

  • 原生 Dart D-Bus 客户端
  • 直接访问 Linux 桌面服务
  • 对消息总线(会话和系统)的支持
  • 跨平台兼容性(Linux、Windows、macOS)
  • 简洁的异步 Dart API

适合对象

  • 面向 Linux 的桌面应用程序开发者
  • 系统级集成
  • 使用 Dart 开发桌面工具的开发者
  • 需要桌面服务通信的应用程序
  • 需要低级别 Linux 集成的项目

使用建议

  • 主要针对 Linux 环境设计
  • 除了基本用法外,文档有限
  • 目标系统上需要 D-Bus 守护进程可用
  • 在 Windows/macOS 上可能需要平台特定的配置
  • 不适用于移动或Web平台

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

Pub Package codecov

A native Dart client implementation of D-Bus.

Accessing remote objects

The easiest way to get started is to generate Dart classes from a D-Bus interface definition, for example:

<node name="/com/example/Test/Object">
  <interface name="com.example.Test">
    <property name="Version" type="s" access="read"/>
    <method name="ReverseText">
      <arg name="input" type="s" direction="in"/>
      <arg name="output" type="s" direction="out"/>
    </method>
  </interface>
</node>

The dart-dbus tool processes this interface to generate a Dart source file:

$ dart-dbus generate-remote-object test-object.xml -o test-remote-object.dart

You can then use the generated test-remote-object.dart to access that remote object from your program:

import 'package:dbus/dbus.dart';
import 'test-remote-object.dart';

Future<void> main() async {
  var client = DBusClient.session();
  var object = ComExampleTestObject(client, 'com.example.Test');
  var version = await object.getVersion();
  print('version: $version');
  var reversedText = await object.callReverseText('Hello World');
  print(reversedText);
  await client.close();
}

The code generated by dart-dbus may not be the cleanest API you want to expose for your service. It is recommended that you use the generated code as a starting point and then modify it as necessary.

Exporting local objects

The above interface definition can also be processed to generate a class for exporting this object.

$ dart-dbus generate-object test-object.xml -o test-object.dart

You can then use the generated test-object.dart in your program:

import 'package:dbus/dbus.dart';
import 'test-object.dart';

class TestObject extends ComExampleTestObject {
  @override
  Future<DBusMethodResponse> getVersion() async {
    return DBusGetPropertyResponse(DBusString('1.2'));
  }

  @override
  Future<DBusMethodResponse> doReverseText(String input) async {
    var reversedText = String.fromCharCodes(input.codeUnits.reversed);
    return DBusMethodSuccessResponse([DBusString(reversedText)]);
  }
}

Future<void> main() async {
  var client = DBusClient.session();
  await client.requestName('com.example.Test');
  await client.registerObject(TestObject());
}

Using objects without dbus-dart

You can also choose to access D-Bus objects directly without interface definitions and dbus-dart. This requires writing more code and handing more error cases.

The following code shows how to access the remote object in the above examples:

import 'package:dbus/dbus.dart';

Future<void> main() async {
  var client = DBusClient.session();
  var object = DBusRemoteObject(client, name: 'com.example.Test', path: DBusObjectPath('/com/example/Test/Object'));
  var value = await object.getProperty('com.example.Test', 'Version', signature: DBusSignature('s'));
  var version = value.asString();
  print('version: $version');
  var response = await object.callMethod('com.example.Test', 'ReverseText', [DBusString('Hello World')], replySignature: DBusSignature('s'));
  var reversedText = response.values[0].asString();
  print('$reversedText');
  await client.close();
}

And the following shows how to export that object:

import 'package:dbus/dbus.dart';

class TestObject extends DBusObject {
  TestObject() : super(DBusObjectPath('/com/example/Test/Object'));

  @override
  Future<DBusMethodResponse> getProperty(String interface, String name) async {
    if (interface == 'com.example.Test' && name == 'Version') {
      return DBusGetPropertyResponse(DBusString('1.2'));
    } else {
      return DBusMethodErrorResponse.unknownProperty();
    }
  }

  @override
  Future<DBusMethodResponse> handleMethodCall(DBusMethodCall methodCall) async {
    if (methodCall.interface == 'com.example.Test') {
      if (methodCall.name == 'ReverseText') {
        if (methodCall.signature != DBusSignature('s')) {
          return DBusMethodErrorResponse.invalidArgs();
        }
	var input = methodCall.values[0].asString();
        var reversedText = String.fromCharCodes(input.codeUnits.reversed);
        return DBusMethodSuccessResponse([DBusString(reversedText)]);
      } else {
        return DBusMethodErrorResponse.unknownMethod();
      }
    } else {
      return DBusMethodErrorResponse.unknownInterface();
    }
  }
}

Future<void> main() async {
  var client = DBusClient.session();
  await client.requestName('com.example.Test');
  await client.registerObject(TestObject());
}

Contributing to dbus.dart

We welcome contributions! See the contribution guide for more details.

所属分类

依赖

依赖清单 4 项

源码仓库

使用此插件的项目