Flutter实时通信插件signalr_netcore的使用

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

Flutter实时通信插件signalr_netcore的使用

介绍

signalr_netcore 是一个为 ASP.NET Core SignalR 设计的Flutter客户端库。它简化了在应用程序中添加实时Web功能的过程,允许服务器端代码即时向客户端推送内容。此客户端支持自动重连、调用服务端Hub函数(包括流式函数)以及接收来自服务端的方法调用。

支持的传输协议

  • WebSocket
  • Server Side Events
  • Long Polling

支持的Hub协议

  • JSON
  • MessagePack

快速开始

要开始使用 signalr_netcore 插件,请先将其添加到您的 pubspec.yaml 文件中:

dependencies:
  flutter:
    sdk: flutter

  signalr_netcore: ^latest_version # 使用最新版本

注意:如果您遇到问题(例如无法接收到消息回调),可以尝试使用旧版本如 0.1.7+2-nullsafety.3,但请注意该版本不支持自动重连功能。

示例代码

下面是一个完整的示例程序,演示如何创建与SignalR服务器的连接,并实现基本的交互操作。

main.dart

import 'package:flutter/material.dart';
import 'package:signalr_netcore/signalr_client.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: ChatScreen(),
    );
  }
}

class ChatScreen extends StatefulWidget {
  @override
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  final TextEditingController _controller = TextEditingController();
  final List<String> _messages = [];
  HubConnection? _hubConnection;

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

  void _initHubConnection() async {
    final serverUrl = "http://localhost:5000/chatHub"; // 替换为您的服务器地址
    _hubConnection = HubConnectionBuilder()
        .withUrl(serverUrl)
        .build();

    // 监听来自服务器的消息
    _hubConnection!.on("ReceiveMessage", (List<Object?>? args) {
      if (args != null && args.isNotEmpty) {
        setState(() {
          _messages.add(args[0].toString());
        });
      }
    });

    try {
      await _hubConnection!.start();
      print("Connected to the hub.");
    } catch (e) {
      print("Error connecting to the hub: $e");
    }
  }

  void _sendMessage(String message) async {
    try {
      await _hubConnection!.invoke("SendMessage", args: <Object>[message]);
      _controller.clear();
    } catch (e) {
      print("Failed to send message: $e");
    }
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('SignalR Chat')),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: _messages.length,
              itemBuilder: (context, index) {
                return ListTile(title: Text(_messages[index]));
              },
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: _controller,
                    decoration: InputDecoration(hintText: 'Type a message...'),
                  ),
                ),
                IconButton(
                  icon: Icon(Icons.send),
                  onPressed: () => _sendMessage(_controller.text),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

服务器端配置(ASP.NET Core)

确保您的ASP.NET Core应用程序已正确配置SignalR,并且启用了所需的协议(JSON或MessagePack)。这里以简单的聊天Hub为例:

Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSignalR(); // 如果使用MessagePack协议,则添加.AddMessagePackProtocol()
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<ChatHub>("/chatHub");
        });
    }
}

ChatHub.cs

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", $"{user}: {message}");
    }
}

通过以上步骤,您应该能够成功地在Flutter应用中集成SignalR并实现基本的实时通信功能。根据实际需求,您可以进一步扩展和优化这些代码片段。


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

1 回复

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


在Flutter中使用signalr_netcore插件来实现实时通信,可以基于ASP.NET Core SignalR进行开发。以下是一个简单的示例,展示如何在Flutter客户端和ASP.NET Core服务器端建立实时通信。

1. 设置ASP.NET Core SignalR服务器端

首先,创建一个新的ASP.NET Core项目,并添加SignalR支持。

安装必要的NuGet包

在项目的.csproj文件中或者通过NuGet包管理器控制台安装以下包:

dotnet add package Microsoft.AspNetCore.SignalR

配置SignalR

Startup.cs中配置SignalR:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSignalR();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<ChatHub>("/chat");
        });
    }
}

创建SignalR Hub

创建一个新的Hub类,例如ChatHub.cs

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

2. 设置Flutter客户端

在Flutter项目中,添加signalr_netcore依赖项。

pubspec.yaml中添加依赖项

dependencies:
  flutter:
    sdk: flutter
  signalr_netcore: ^latest_version  # 请替换为最新版本号

初始化SignalR连接

创建一个新的Flutter项目,并在main.dart中初始化SignalR连接:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ChatScreen(),
    );
  }
}

class ChatScreen extends StatefulWidget {
  @override
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  SignalRClient? _signalRClient;
  TextEditingController _messageController = TextEditingController();
  List<String> _messages = [];

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

  void initSignalR() async {
    _signalRClient = await SignalRClient.builder()
        .withUrl("http://your_server_address:port/chat")
        .withAutomaticReconnect()
        .build();

    _signalRClient!.on("ReceiveMessage", (user, message) {
      setState(() {
        _messages.add("${user}: ${message}");
      });
    });

    await _signalRClient!.start();
  }

  void sendMessage() async {
    if (_messageController.text.isNotEmpty) {
      await _signalRClient!.invoke("SendMessage", "FlutterUser", _messageController.text);
      _messageController.clear();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Flutter SignalR Chat"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: <Widget>[
            Expanded(
              child: ListView.builder(
                itemCount: _messages.length,
                itemBuilder: (context, index) {
                  return Text(_messages[index]);
                },
              ),
            ),
            TextField(
              controller: _messageController,
              decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: "Message",
                suffixIcon: IconButton(
                  icon: Icon(Icons.send),
                  onPressed: sendMessage,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

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

3. 运行项目

确保ASP.NET Core SignalR服务器正在运行,然后启动Flutter项目。你现在应该能够在Flutter客户端和ASP.NET Core服务器端之间发送和接收实时消息。

注意事项

  1. 安全性:确保在生产环境中使用安全的连接(如HTTPS)。
  2. 错误处理:添加适当的错误处理逻辑以处理连接失败和消息发送失败的情况。
  3. 跨平台signalr_netcore插件通常应该支持iOS和Android,但请确保进行充分的测试。

这个示例展示了如何在Flutter客户端和ASP.NET Core服务器端之间使用SignalR进行实时通信。你可以根据需要扩展和修改这个示例以适应你的具体需求。

回到顶部