Flutter WebSocket通信插件action_cable的使用

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

Flutter WebSocket通信插件action_cable的使用

ActionCable 是 Rails 默认的实时 WebSocket 框架和协议。action_cable 插件为 Dart 提供了一个客户端实现,适用于 Web、DartVM 和 Flutter。

使用方法

连接到一个频道 🙌

首先,需要连接到 WebSocket 服务器:

import 'package:action_cable/action_cable.dart';

var cable = ActionCable.connect(
  "ws://10.0.2.2:3000/cable", // 替换为你的WebSocket地址
  headers: {
    "Authorization": "Some Token", // 可选的认证信息
  },
  onConnected: () {
    print("connected");
  },
  onConnectionLost: () {
    print("connection lost");
  },
  onCannotConnect: () {
    print("cannot connect");
  }
);

订阅一个频道 🎉

成功连接后,可以订阅特定的频道:

cable.subscribe(
  "Chat", // 频道名称,可以是 "Chat" 或 "ChatChannel"
  channelParams: { "room": "private" }, // 频道参数
  onSubscribed: (){
    print("subscribed to Chat channel");
  }, 
  onDisconnected: (){
    print("disconnected from Chat channel");
  },
  onMessage: (Map message) {
    print("Received message: $message");
  } // 接收到消息时调用
);

取消订阅一个频道 🎃

如果不再需要监听某个频道,可以取消订阅:

cable.unsubscribe(
  "Chat", // 频道名称
  {"room": "private"} // 频道参数
);

在 ActionCable 服务器上执行操作 🎇

你可以通过 performAction 方法在服务器上执行特定的操作:

cable.performAction(
  "Chat",
  action: "send_message", // 动作名称,需与服务器端定义的方法名一致
  channelParams: { "room": "private" },
  actionParams: { "message": "Hello private peeps! 😜" } // 发送的消息内容
);

注意:你需要在 Rails 的 Action Cable 通道中定义一个名为 send_message 的方法。

断开与 ActionCable 服务器的连接

当不再需要 WebSocket 连接时,可以断开连接:

cable.disconnect();

完整示例 Demo

下面是一个完整的 Flutter 示例,展示了如何使用 action_cable 插件进行 WebSocket 通信:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('ActionCable Demo')),
        body: Center(child: WebSocketDemo()),
      ),
    );
  }
}

class WebSocketDemo extends StatefulWidget {
  @override
  _WebSocketDemoState createState() => _WebSocketDemoState();
}

class _WebSocketDemoState extends State<WebSocketDemo> {
  var cable;

  @override
  void initState() {
    super.initState();

    // 初始化 WebSocket 连接
    cable = ActionCable.connect(
      "ws://10.0.2.2:3000/cable",
      headers: {
        "Authorization": "Some Token",
      },
      onConnected: () {
        print("connected");
        subscribeToChannel();
      },
      onConnectionLost: () {
        print("connection lost");
      },
      onCannotConnect: () {
        print("cannot connect");
      }
    );
  }

  void subscribeToChannel() {
    cable.subscribe(
      "Chat",
      channelParams: { "room": "private" },
      onSubscribed: () {
        print("subscribed to Chat channel");
        sendMessage();
      },
      onDisconnected: () {
        print("disconnected from Chat channel");
      },
      onMessage: (Map message) {
        print("Received message: $message");
      }
    );
  }

  void sendMessage() {
    cable.performAction(
      "Chat",
      action: "send_message",
      channelParams: { "room": "private" },
      actionParams: { "message": "Hello private peeps! 😜" }
    );
  }

  @override
  void dispose() {
    cable.disconnect(); // 确保在组件销毁时断开连接
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Text("Check the console for WebSocket messages!");
  }
}

此示例展示了如何在 Flutter 应用中集成 action_cable 插件,并通过 WebSocket 进行简单的消息发送和接收。

希望这个帖子能帮助你更好地理解和使用 Flutter 中的 WebSocket 通信!如果有任何问题或建议,请随时留言。


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

1 回复

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


在Flutter中使用WebSocket通信插件action_cable进行通信,可以借助action_cable_flutter包来实现。这个包允许你与Rails应用程序中的ActionCable进行WebSocket连接。以下是一个基本的代码示例,展示如何在Flutter应用中使用action_cable_flutter进行WebSocket通信。

首先,确保你的Flutter项目中已经添加了action_cable_flutter依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  action_cable_flutter: ^最新版本号  # 请替换为实际可用的最新版本号

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

接下来,是主要的代码实现部分。以下是一个完整的示例,包括建立WebSocket连接、订阅频道以及处理接收到的消息。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter ActionCable Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final String websocketUrl = 'wss://your-rails-app-url/cable';
  final String consumerName = 'YourConsumer';
  final String channelName = 'YourChannel';
  ActionCableClient? _cableClient;
  Subscription? _subscription;
  List<String> _messages = [];

  @override
  void initState() {
    super.initState();
    initCableClient();
  }

  void initCableClient() {
    _cableClient = ActionCableClient(
      url: websocketUrl,
      consumer: consumerName,
      onConnect: () {
        print('Connected to ActionCable');
        subscribeToChannel();
      },
      onDisconnect: () {
        print('Disconnected from ActionCable');
      },
    );

    _cableClient!.connect();
  }

  void subscribeToChannel() {
    _subscription = _cableClient!.subscribe(
      channel: channelName,
      params: {'some_param': 'value'},
      onReceived: (data) {
        setState(() {
          _messages.add(data['message']);
        });
      },
    );
  }

  @override
  void dispose() {
    _subscription?.unsubscribe();
    _cableClient?.disconnect();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter ActionCable Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Expanded(
              child: ListView.builder(
                itemCount: _messages.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text(_messages[index]),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 依赖配置:在pubspec.yaml中添加了action_cable_flutter依赖。
  2. 初始化客户端:在initState方法中初始化ActionCableClient,并连接到WebSocket服务器。
  3. 订阅频道:一旦连接建立,就订阅指定的频道,并处理接收到的消息。
  4. UI展示:使用ListView展示接收到的消息。

请确保将websocketUrlconsumerNamechannelName以及订阅参数替换为你自己的Rails应用程序中的实际值。

这个示例展示了基本的ActionCable集成,实际应用中你可能需要根据具体需求进行更多的配置和处理。

回到顶部