Flutter实时通信插件messaging_signalr的使用

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

Flutter实时通信插件messaging_signalr的使用

介绍

messaging_signalr 包用于管理基于 SignalR 的消息应用程序所需的所有数据和功能。

使用方法

pubspec.yaml 文件中添加依赖:

dependencies:
  messaging_signalr: 1.0.0

导入包:

import 'package:messaging_signalr/messaging_signalr.dart';

初始化

在使用包的功能之前,必须调用 init 函数。在初始化函数中,你需要配置服务器地址,并传递从 FirebaseMessaging 接收到的 Firebase Token(详见 firebase_messaging 包)。此外,还需要传递一些回调函数,这些回调函数将在任务成功或失败时被调用。

SignalRMessaging.init(
    serverAddress: 'http://167.235.239.170:5025/Myhub', // 替换为你的 SignalR 服务器地址
    firebaseToken: ConstValues.fireBaseToken, // 替换为你的 Firebase Token
    onSendMessage: () {}, // 消息发送完成时调用
    onGetContactInfo: () {}, // 添加新联系人后,接收联系人信息完成后调用
    onGetContactInfoCanceled: (String message) { // 获取联系人信息失败时调用
      print('获取联系人信息失败: $message');
    },
    onCreateGroup: (String message) { // 创建群组成功或已存在时调用
      print('创建群组结果: $message');
    },
);

示例代码

以下是一个完整的示例,展示如何使用 messaging_signalr 显示聊天列表。

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

class ChatListPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('聊天列表'),
      ),
      body: ListView(
        children: [
          ...SignalRMessaging.chats.map((chat) {
            return Container(
              height: 65,
              decoration: const BoxDecoration(
                border: Border(
                  bottom: BorderSide(
                    width: 1.0,
                    color: Colors.black,
                    style: BorderStyle.solid,
                  ),
                ),
              ),
              child: Row(
                children: [
                  // 用户头像
                  Container(
                    margin: const EdgeInsets.only(right: 8.0, left: 8.0, bottom: 8.0),
                    padding: const EdgeInsets.all(10),
                    height: 60,
                    width: 60,
                    decoration: BoxDecoration(
                      color: Colors.blue,
                      borderRadius: BorderRadius.circular(30),
                    ),
                    child: FittedBox(
                      fit: BoxFit.fitWidth,
                      child: Text(
                        firstTwoCharsOfName(chat.userName ?? chat.chatId), // 显示用户名的前两个字符
                        style: const TextStyle(color: Colors.white),
                      ),
                    ),
                  ),
                  // 聊天信息
                  Expanded(
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Padding(
                          padding: const EdgeInsets.only(bottom: 8.0),
                          child: Text(
                            chat.userName ?? chat.chatId, // 显示用户名或聊天ID
                            style: const TextStyle(
                              fontSize: 18,
                              fontWeight: FontWeight.bold,
                              color: Colors.black,
                            ),
                          ),
                        ),
                        Text(
                          chat.messages.isNotEmpty
                              ? "${chat.messages.last.senderUserName}: ${chat.messages.last.text}" // 最近一条消息
                              : chat.type == ChatType.contact
                                  ? "向 ${chat.userName} 打招呼!"
                                  : "向所有人打招呼!",
                          style: const TextStyle(
                            color: Colors.black,
                          ),
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            );
          }).toList(),
        ],
      ),
    );
  }

  String firstTwoCharsOfName(String name) {
    return name.length > 2 ? name.substring(0, 2) : name;
  }
}

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

1 回复

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


messaging_signalr 是一个用于在 Flutter 应用中实现实时通信的插件,它基于 SignalR 协议。SignalR 是一个由 Microsoft 开发的库,用于在 Web 应用中实现实时通信功能,通常用于实现服务器与客户端之间的双向通信。

以下是如何在 Flutter 项目中使用 messaging_signalr 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 messaging_signalr 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  messaging_signalr: ^1.0.0  # 请使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入 messaging_signalr 插件:

import 'package:messaging_signalr/messaging_signalr.dart';

3. 创建 SignalR 连接

使用 SignalR 类来创建和管理与 SignalR 服务器的连接。

final signalR = SignalR(
  url: 'https://your-signalr-server-url/hub', // SignalR 服务器地址
  hubName: 'YourHubName', // Hub 名称
);

4. 连接和断开连接

使用 start 方法连接到 SignalR 服务器,使用 stop 方法断开连接。

await signalR.start(); // 连接到服务器

signalR.stop(); // 断开连接

5. 发送和接收消息

使用 invoke 方法向服务器发送消息,使用 on 方法监听来自服务器的消息。

// 发送消息
signalR.invoke('SendMessage', args: ['Hello, SignalR!']);

// 监听消息
signalR.on('ReceiveMessage', (List<dynamic> args) {
  print('Received message: ${args[0]}');
});

6. 处理连接状态

你可以监听连接状态的变化,以便在 UI 中显示连接状态。

signalR.onConnectionStateChanged((state) {
  print('Connection state changed: $state');
});

7. 错误处理

你可以监听错误事件来处理连接或通信中的错误。

signalR.onError((error) {
  print('Error: $error');
});

完整示例

以下是一个简单的完整示例,展示了如何使用 messaging_signalr 插件进行实时通信:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SignalRExample(),
    );
  }
}

class SignalRExample extends StatefulWidget {
  [@override](/user/override)
  _SignalRExampleState createState() => _SignalRExampleState();
}

class _SignalRExampleState extends State<SignalRExample> {
  final signalR = SignalR(
    url: 'https://your-signalr-server-url/hub',
    hubName: 'YourHubName',
  );

  [@override](/user/override)
  void initState() {
    super.initState();
    _connectToSignalR();
  }

  void _connectToSignalR() async {
    await signalR.start();

    signalR.on('ReceiveMessage', (List<dynamic> args) {
      print('Received message: ${args[0]}');
    });

    signalR.onConnectionStateChanged((state) {
      print('Connection state changed: $state');
    });

    signalR.onError((error) {
      print('Error: $error');
    });
  }

  void _sendMessage() {
    signalR.invoke('SendMessage', args: ['Hello, SignalR!']);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SignalR Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _sendMessage,
          child: Text('Send Message'),
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    signalR.stop();
    super.dispose();
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!