Flutter实时通信插件signalr_dart的使用

Flutter 实时通信插件 signalr_dart 的使用

signalr_dart 是一个完整的 Dart SignalR 客户端,支持状态化的重连功能。使用这个库时,你会感到非常熟悉,因为它的 API 尽可能保持与原版相似。

我知道 Dart 中有很多其他的 SignalR 客户端,但它们要么存在问题(因为它们没有遵循 SignalR 客户端代码流),要么已被弃用或未被维护。你可以通过对比仓库与 SignalR C# 客户端 仓库来验证这一点。

该库支持所有平台,在 Windows 和浏览器上都经过了测试。

支持的传输方式:

  • WebSocket
  • ServerSentEvents (SSE)
  • Long Polling

支持的中心协议:

  • Json
  • Message Pack (SSE 不支持) (使用 此包 可以处理 Message Pack)

你可以在 这里 找到完整的示例代码。还提供了一个测试服务器 这里

TODO 列表:

  • Http2
  • Proxy
  • 实现服务端(暂时不考虑)

示例代码

以下是一个简单的示例代码,展示如何在 Flutter 应用程序中使用 signalr_dart 插件进行实时通信。

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:signalr_dart/signalr_dart.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('SignalR Example')),
        body: Center(child: Text('SignalR Test Page')),
        floatingActionButton: FloatingActionButton(
          onPressed: () => _connectToHub(context),
          child: Icon(Icons.connect_without_contact),
        ),
      ),
    );
  }

  Future<void> _connectToHub(BuildContext context) async {
    // 创建一个新的连接
    final connection = HubConnectionBuilder()
        .withUrl("http://localhost:5000/hub")
        .build();

    try {
      // 启动连接
      await connection.start();
      print("Connected to the hub!");

      // 订阅消息事件
      connection.on("ReceiveMessage", (args, _) {
        print("Received message: ${jsonDecode(args[1])}");
        // 显示消息
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(jsonDecode(args[1]))));
      });

      // 发送消息
      connection.invoke("SendMessage", args: ["User1", "Hello, World!"]).then((result) {
        print("Message sent!");
      }).catchError((error) {
        print("Failed to send message: $error");
      });
    } catch (e) {
      print("Error during connection setup: $e");
    }
  }
}

代码说明

  1. 导入必要的包

    import 'dart:convert';
    import 'package:flutter/material.dart';
    import 'package:signalr_dart/signalr_dart.dart';
    
  2. 创建主应用类

    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: Text('SignalR Example')),
            body: Center(child: Text('SignalR Test Page')),
            floatingActionButton: FloatingActionButton(
              onPressed: () => _connectToHub(context),
              child: Icon(Icons.connect_without_contact),
            ),
          ),
        );
      }
    
  3. 定义 _connectToHub 方法

    Future<void> _connectToHub(BuildContext context) async {
      // 创建一个新的连接
      final connection = HubConnectionBuilder()
          .withUrl("http://localhost:5000/hub")
          .build();
    
      try {
        // 启动连接
        await connection.start();
        print("Connected to the hub!");
    
        // 订阅消息事件
        connection.on("ReceiveMessage", (args, _) {
          print("Received message: ${jsonDecode(args[1])}");
          // 显示消息
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(jsonDecode(args[1]))));
        });
    
        // 发送消息
        connection.invoke("SendMessage", args: ["User1", "Hello, World!"]).then((result) {
          print("Message sent!");
        }).catchError((error) {
          print("Failed to send message: $error");
        });
      } catch (e) {
        print("Error during connection setup: $e");
      }
    }
    

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用signalr_dart插件来实现实时通信的代码案例。这个插件允许你与ASP.NET Core SignalR服务器进行通信。

首先,你需要在你的Flutter项目中添加signalr_dart依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  signalr_dart: ^x.y.z  # 请替换为最新版本号

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

接下来,你需要配置SignalR连接并处理消息。以下是一个完整的示例,包括连接到SignalR服务器、发送消息和处理接收到的消息。

import 'package:flutter/material.dart';
import 'package:signalr_dart/signalr.dart';

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

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

class SignalRScreen extends StatefulWidget {
  @override
  _SignalRScreenState createState() => _SignalRScreenState();
}

class _SignalRScreenState extends State<SignalRScreen> {
  late HubConnection _hubConnection;
  final TextEditingController _messageController = TextEditingController();
  final List<String> _messages = [];

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

  void initSignalR() async {
    // 替换为你的SignalR服务器URL
    String serverUrl = 'https://your-signalr-server-url';
    _hubConnection = HubConnectionBuilder()
        .withUrl(serverUrl)
        .withAutomaticReconnect()
        .build();

    _hubConnection.onclose((error) {
      print('Connection closed with error: ${error?.message}');
      initSignalR(); // 尝试重新连接
    });

    _hubConnection.on('ReceiveMessage', (arguments) {
      final message = arguments[0] as String;
      setState(() {
        _messages.add(message);
      });
    });

    await _hubConnection.start();
    print('Connected to SignalR server');
  }

  void sendMessage() async {
    if (_messageController.text.isNotEmpty) {
      await _hubConnection.invoke('SendMessage', _messageController.text);
      _messageController.clear();
    }
  }

  @override
  void dispose() {
    _hubConnection.stop();
    _messageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SignalR 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]),
                  );
                },
              ),
            ),
            TextField(
              controller: _messageController,
              decoration: InputDecoration(
                labelText: 'Send a message',
                border: OutlineInputBorder(),
              ),
              onEditingComplete: sendMessage,
            ),
            ElevatedButton(
              onPressed: sendMessage,
              child: Text('Send'),
            ),
          ],
        ),
      ),
    );
  }
}

代码说明:

  1. 依赖安装:在pubspec.yaml中添加signalr_dart依赖。
  2. SignalR连接初始化:在initSignalR方法中初始化HubConnection,并设置自动重连。
  3. 处理接收到的消息:通过_hubConnection.on方法监听ReceiveMessage事件,并将接收到的消息添加到UI中。
  4. 发送消息:通过_hubConnection.invoke方法调用SendMessage方法发送消息。
  5. UI构建:使用ListView显示接收到的消息,并提供一个TextFieldElevatedButton用于发送消息。

请确保你的SignalR服务器已经正确配置,并且有一个名为ReceiveMessage的事件和一个名为SendMessage的方法。这样,你就可以在Flutter应用中实现实时通信了。

回到顶部