Flutter实时扩展功能插件app_realtime_ext的使用

Flutter实时扩展功能插件app_realtime_ext的使用

安装 💻

为了开始使用 app_realtime_ext,您必须在您的机器上安装 Flutter SDK

通过以下命令安装:

dart pub add app_realtime_ext

持续集成 🤖

app_realtime_ext 配备了由 Very Good Workflows 支持的内置 GitHub Actions 工作流。但您也可以添加您喜欢的 CI/CD 解决方案。

默认情况下,在每次拉取请求和推送时,CI 会格式化、检查和测试代码。这确保了代码的一致性和正确性。项目使用 Very Good Analysis 进行严格的分析选项设置。使用 Very Good Workflows 来强制执行代码覆盖率。

运行测试 🧪

对于第一次使用的用户,请安装 very_good_cli

dart pub global activate very_good_cli

运行所有单元测试:

very_good test --coverage

要查看生成的覆盖率报告,可以使用 lcov

# 生成覆盖率报告
genhtml coverage/lcov.info -o coverage/

# 打开覆盖率报告
open coverage/index.html

为什么创建这个包?

我知道,Appwrite Flutter SDK 是由 sdk-generator 生成的。这是一个很棒的工具,用于为不同的语言生成不同的 SDK。但是,这里有一个问题。如果我们需要更新特定 Appwrite SDK 中的某些代码,它必须与其他 SDK 保持一致。因此,我决定通过克隆并仅从 Appwrite Flutter SDK 中获取与实时相关的代码来创建这个包。这个包不是由 sdk-generator 生成的。这是手动过程,以从 Appwrite Flutter SDK 获取实时相关代码。我将维护此包以使其与 Appwrite Flutter SDK 保持最新。另一个原因是,我们可以通过向此包添加更多功能来扩展 Appwrite Flutter SDK 的功能。

如何使用这个包?

首先导入包:

import 'package:app_realtime_ext/app_realtime_ext.dart';

然后初始化:

final RealtimeExt realtime = RealtimeExt();
realtime.initialize(client: client);

注意: <code>client</code> 是来自 Appwrite Flutter SDK 的 Client 实例。

initialize 方法具有以下参数:

  • <code>client</code> (必需): 来自 Appwrite Flutter SDK 的 Client 实例。
  • <code>retryAttempts</code> (可选): 连接到服务器的重试次数。默认值为 3。
  • <code>pingInterval</code> (可选): 每次重试之间的间隔(毫秒)。默认值为 30 秒。
  • <code>pingEnabled</code> (可选): 是否启用 ping 机制。默认值为 <code>true</code>
  • <code>autoReconnect</code> (可选): 当连接丢失时是否自动重新连接到服务器。默认值为 <code>true</code>。但是,当达到 <code>retryAttempts</code> 时,autoReconnect 将停止。

你不再需要时需要销毁 realtime 对象:

realtime.dispose();

什么是 <code>pingInterval</code>?

根据这个网站 RFC 6455

WebSocket 规范定义了 ping 和 pong 消息操作码作为协议的一部分。这些可以作为一种方式来保持连接活跃,即使没有数据传输。 Pings 可以从任何一方发送。如果客户端接收到一个 ping,则会自动发送一个 pong。

然而,Appwrite WebSocket 不支持双向通信。因此,服务器可能会发送类似的消息。{"type":"error","data":{"code":1003,"message":"Message type is not valid."}}。在这种情况下,包会自动重新连接到服务器。但是,期望的是从服务器收到一个 pong 消息。因此,<code>pingInterval</code> 是每次向服务器发送 ping 消息的时间间隔。如果服务器没有响应 pong 消息,包将自动重新连接到服务器。希望 Appwrite 团队在未来实现 pong 消息。

订阅 <code>subscribe</code>

订阅方法类似于 Appwrite SDK。它订阅一个频道并监听事件。这次方法是异步的。

Future<RealtimeSubscriptionExt> subscribe(String channel) async {
  return await realtime.subscribe([channel]);
}

<code>stateStream</code><code>state</code>

<code>stateStream</code> 是一个 <code>Stream</code>,它发出 <code>RealtimeState</code> 的 WebSocket 连接状态。

realtime.stateStream.listen((state) {
  print(state);
});

我们在 <code>RealtimeState</code> 枚举中有不同的状态:

  • <code>ConnectedState</code>: WebSocket 连接已连接。
  • <code>DisconnectedState</code>: WebSocket 连接已断开。
  • <code>ReconnectingState</code>: WebSocket 连接正在重新连接。
  • <code>ErrorState</code>: WebSocket 连接无法连接。
  • <code>SubscribedState</code>: WebSocket 连接已订阅到频道。
  • <code>UnsubscribedState</code>: WebSocket 连接已取消订阅频道。
  • <code>PingState</code>: WebSocket 连接正在向服务器发送 ping 消息。
  • <code>DisposingState</code>: WebSocket 连接正在清理。

使用方法:

realtime.stateStream.listen((state) {
    if(state is ErrorState){
        showErrorDialog();
    }
});

<code>state</code> 是一个返回当前 <code>RealtimeState</code> 的 WebSocket 连接状态的 getter。

print(realtime.state);

<code>getConnectionCompleter</code>

<code>getConnectionCompleter</code> 是一个 <code>Completer</code>,当 WebSocket 连接成功时完成。如果您尝试创建新文档时可以使用它。但在使用之前必须先检查 WebSocket 连接是否已连接。

Future<void> doSomething() async{
    isLoading = true;
    await realtime.getConnectionCompleter.future;
    await createDocument();
}

<code>reconnect</code>

您可以手动重新连接到服务器,通过调用 <code>reconnect</code> 方法。

realtime.reconnect();

<code>setPingEnabled</code>

是否启用 ping 机制。默认值为 <code>true</code>

realtime.setPingEnabled(false);

更多关于Flutter实时扩展功能插件app_realtime_ext的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter实时扩展功能插件app_realtime_ext的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


app_realtime_ext 是一个 Flutter 插件,用于实现实时扩展功能。这个插件通常用于在 Flutter 应用中实现实时数据更新、推送通知、实时聊天等功能。以下是如何使用 app_realtime_ext 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 app_realtime_ext 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  app_realtime_ext: ^版本号  # 请替换为最新的版本号

然后运行 flutter pub get 来获取依赖。

2. 初始化插件

在你的 Flutter 应用中初始化 app_realtime_ext 插件。通常,你可以在 main.dart 文件中进行初始化:

import 'package:app_realtime_ext/app_realtime_ext.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化插件
  await AppRealtimeExt.initialize(
    apiKey: 'YOUR_API_KEY',  // 替换为你的API密钥
    projectId: 'YOUR_PROJECT_ID',  // 替换为你的项目ID
  );
  
  runApp(MyApp());
}

3. 监听实时事件

你可以使用 AppRealtimeExt 来监听实时事件。例如,监听某个频道的消息:

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  StreamSubscription? _subscription;

  @override
  void initState() {
    super.initState();
    
    // 订阅频道
    _subscription = AppRealtimeExt.subscribe('channel_name').listen((event) {
      print('Received event: $event');
      // 处理事件
    });
  }

  @override
  void dispose() {
    _subscription?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Realtime Ext Example'),
        ),
        body: Center(
          child: Text('Listening to realtime events...'),
        ),
      ),
    );
  }
}

4. 发送实时事件

你也可以使用 AppRealtimeExt 来发送实时事件:

void sendEvent() async {
  await AppRealtimeExt.publish('channel_name', {'message': 'Hello, world!'});
}

5. 处理错误

在使用插件时,你可能需要处理一些错误。例如,网络连接问题或认证失败:

_subscription = AppRealtimeExt.subscribe('channel_name').listen(
  (event) {
    print('Received event: $event');
  },
  onError: (error) {
    print('Error: $error');
  },
);
回到顶部