Flutter自定义协议通信插件atproto的使用

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

Flutter自定义协议通信插件atproto的使用

1. 概述 🌎

atproto 是一个用于在 Dart/Flutter 应用中使用 AT Protocol API 的最高效库。该库是跨平台的,并且已经在许多应用中得到了广泛使用。如果你想要使用 Bluesky API,可以查看 bluesky package

1.1. 特性 ⭐

  • 零依赖
  • ✅ 支持强大的 内置重试机制,使用 Exponential BackOff And Jitter
  • ✅ 支持所有主要的 AT Protocol 端点
  • 文档齐全测试完善
  • ✅ 支持强大的 Firehose API
  • ✅ 支持 OAuth DPoP
  • 100% 空安全
  • ✅ 适用于除 Bluesky 之外的其他服务

1.2. 入门指南 💪

1.2.1. 安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  atproto: ^1.0.0

然后运行 flutter pub get 来安装依赖。

1.2.2. 导入

在你的 Dart 文件中导入 atproto 包:

import 'package:atproto/atproto.dart';

1.2.3. 实例化 ATProto

final atproto = ATProto.fromSession(
  session.data,
  service: 'SERVICE_NAME', // 默认为 `bsky.social`
  relayService: 'STREAM_SERVICE_NAME', // 默认为 `bsky.network`
  retryConfig: RetryConfig(
    maxAttempts: 5,
    jitter: Jitter(
      minInSeconds: 2,
      maxInSeconds: 5,
    ),
    onExecute: (event) => print(
      'Retry after ${event.intervalInSeconds} seconds...[${event.retryCount} times]',
    ),
  ),
  timeout: Duration(seconds: 20), // 默认超时时间为 30 秒
);

1.3. 支持的端点 👀

atproto 支持以下主要端点:

  • com.atproto.server.*
  • com.atproto.identity.*
  • com.atproto.repo.*
  • com.atproto.moderation.*
  • com.atproto.sync.*
  • com.atproto.label.*

更多详细信息请参阅 官方文档

1.4. 更多提示 🏄

  • 会话管理:如何管理会话状态。
  • 应用密码:如何使用应用密码进行身份验证。
  • 其他服务:如何在非 bsky.social 服务上使用 atproto
  • 序列化与反序列化:如何处理数据的序列化与反序列化。
  • 异常处理:如何处理 API 调用中抛出的异常。
  • 速率限制:如何处理 API 的速率限制。
  • 联合类型:如何处理联合类型。
  • Firehose API:如何使用 Firehose API。
  • 超时设置:如何设置请求的超时时间。
  • 高级内置重试:如何配置更高级的重试策略。
  • Lexicon/Object IDs:如何处理 Lexicon/Object IDs。
  • 分页:如何处理分页数据。

更多详细信息请参阅 官方文档

1.5. 贡献 🏆

如果你希望贡献代码或文档,请创建一个 issue 或提交一个 Pull Request。你可以通过以下方式贡献:

  • 请求参数或响应字段未实现。
  • 文档过时或不完整。
  • 有更好或更创新的方法实现功能。
  • 等等。

更多详细信息请参阅 贡献指南风格指南

1.6. 支持 ❤️

最简单的方式是给项目加星,你可以在 GitHubPub.dev 上加星支持我们。

你也可以通过成为 GitHub 赞助者 来支持我们。

1.7. 许可证 🔑

atproto 的所有资源均在 BSD-3 许可证 下提供。

1.8. 更多信息 🧐

atproto 由 [Shinya Kato (@myConsciousness)](https://github.com/myConsciousness) 设计和实现。

示例代码

以下是一个简单的示例代码,展示了如何使用 atproto 进行基本的 API 调用:

// Copyright 2023 Shinya Kato. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided the conditions.

import 'package:atproto/atproto.dart';
import 'package:atproto/core.dart';

/// https://atprotodart.com/docs/packages/atproto
Future<void> main() async {
  try {
    //! 首先需要与 ATP 服务器建立会话。
    final session = await createSession(
      service: 'SERVICE_NAME', //! 默认为 `bsky.social`
      identifier: 'YOUR_HANDLE_OR_EMAIL', //! 类似 `shinyakato.bsky.social`
      password: 'YOUR_PASSWORD',
    );

    print(session);

    final atproto = ATProto.fromSession(
      session.data,

      //! 默认为 `bsky.social`,或者根据会话动态解析
      service: 'SERVICE_NAME',

      //! 默认为 `bsky.network`
      relayService: 'STREAM_SERVICE_NAME',

      //! 当与 API 通信时发生服务器错误或网络错误时,自动重试可用。
      retryConfig: RetryConfig(
        maxAttempts: 5,
        jitter: Jitter(
          minInSeconds: 2,
          maxInSeconds: 5,
        ),
        onExecute: (event) => print(
          'Retry after ${event.intervalInSeconds} seconds...'
          '[${event.retryCount} times]',
        ),
      ),

      //! 默认超时时间为 30 秒。
      timeout: Duration(seconds: 20),
    );

    //! 创建特定服务的记录。
    final createdRecord = await atproto.repo.createRecord(
      collection: NSID.create(
        'feed.bsky.app',
        'post',
      ),
      record: {
        'text': 'Hello, Bluesky!',
        "createdAt": DateTime.now().toUtc().toIso8601String(),
      },
    );

    //! 删除记录。
    await atproto.repo.deleteRecord(
      uri: createdRecord.data.uri,
    );

    //! 你可以轻松使用 Stream API。
    final subscription = await atproto.sync.subscribeRepos();
    subscription.data.stream.listen((event) {
      event.when(
        commit: print,
        identity: print,
        account: print,
        handle: print,
        migrate: print,
        tombstone: print,
        info: print,
        unknown: print,
      );
    });
  } on UnauthorizedException catch (e) {
    print(e);
  } on XRPCException catch (e) {
    print(e);
  }
}

希望这个指南对你有所帮助!如果有任何问题或建议,请随时联系我。


更多关于Flutter自定义协议通信插件atproto的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义协议通信插件atproto的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,自定义协议通信插件atproto允许你与原生平台(iOS和Android)进行自定义协议的通信。虽然具体实现细节和API可能会根据插件的版本和具体需求有所不同,但下面我将提供一个基本的代码框架,展示如何在Flutter中使用atproto插件进行自定义协议通信。

请注意,由于atproto并非一个广泛知名的标准插件,以下示例将基于一个假设的插件API。如果atproto插件的API与假设不同,请查阅其官方文档或源代码进行调整。

1. 添加插件依赖

首先,在你的pubspec.yaml文件中添加atproto插件的依赖。由于atproto并非一个实际存在的通用插件名称,这里假设它已经在pub.dev上发布或你已经将其添加到本地路径中。

dependencies:
  flutter:
    sdk: flutter
  atproto: ^x.y.z  # 替换为实际版本号或本地路径

2. 配置原生平台

对于iOS和Android平台,你可能需要在各自的配置文件中进行一些设置,比如权限申请或插件初始化。具体步骤请参考atproto插件的官方文档。

3. Flutter代码示例

以下是一个简单的Flutter代码示例,展示如何使用atproto插件进行自定义协议通信。

import 'package:flutter/material.dart';
import 'package:atproto/atproto.dart';  // 假设插件的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('atproto Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Sending Custom Protocol Message...'),
              ElevatedButton(
                onPressed: _sendCustomMessage,
                child: Text('Send Message'),
              ),
              Text('Received Message: $_receivedMessage'),
            ],
          ),
        ),
      ),
    );
  }

  String _receivedMessage = '';

  Future<void> _sendCustomMessage() async {
    // 初始化atproto客户端
    final atProtoClient = AtProtoClient();

    try {
      // 发送自定义协议消息
      final response = await atProtoClient.sendMessage({
        'protocol': 'custom',
        'data': {
          'key1': 'value1',
          'key2': 'value2',
        },
      });

      // 处理响应
      setState(() {
        _receivedMessage = response?.data?.toString() ?? 'No response';
      });
    } catch (error) {
      // 处理错误
      setState(() {
        _receivedMessage = 'Error: $error';
      });
    }
  }
}

// 假设的AtProtoClient类,实际使用时请参考插件的API文档
class AtProtoClient {
  Future<Map<String, dynamic>> sendMessage(Map<String, dynamic> message) async {
    // 这里的实现取决于atproto插件的API
    // 通常情况下,你会调用一个原生方法并等待响应
    // 例如:
    // final response = await MethodChannel('atproto_channel').invokeMethod('sendMessage', message);
    // return response;

    // 由于这是一个示例,我们直接返回一个模拟的响应
    return {
      'success': true,
      'data': {
        'responseKey': 'responseValue',
      },
    };
  }
}

注意事项

  1. 插件初始化:确保在Flutter代码中正确初始化atproto插件。
  2. 原生方法调用:上面的AtProtoClient类中的sendMessage方法是一个假设的实现。实际使用时,你需要根据atproto插件提供的API调用原生方法。
  3. 错误处理:在调用原生方法时,务必添加适当的错误处理逻辑。
  4. 平台特定代码:对于iOS和Android平台,可能需要编写平台特定的代码来处理自定义协议通信。

由于atproto并非一个真实存在的插件名称,上述代码和解释是基于假设的。如果atproto是某个特定项目或组织内部的插件,请参考其内部文档和API指南进行实现。

回到顶部