Flutter服务器发送事件(SSE)通信插件sse_channel的使用

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

Flutter服务器发送事件(SSE)通信插件sse_channel的使用

简介

sse_channel 是一个用于处理服务器发送事件(Server Sent Events, SSE)连接的Flutter插件。它提供了一个 StreamChannel 的包装,使得在Flutter应用中与支持SSE的服务器进行交互变得更加简单。

安装

在你的pubspec.yaml文件中添加依赖:

dependencies:
  sse_channel: ^latest_version # 替换为最新版本号

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

使用示例

基本用法

下面是一个简单的例子,展示了如何使用sse_channel来监听来自服务器的消息,并向服务器发送消息。

示例代码

import 'package:sse_channel/sse_channel.dart';
import 'dart:convert';

void main() async {
  // 连接到SSE服务器
  final channel = await SseChannel.connect(Uri.parse('http://127.0.0.1:8080/sseHandler'));

  // 监听从服务器接收到的消息
  channel.stream.listen(
    (message) {
      // 将接收到的消息转换为Map对象
      Map<String, dynamic> data = jsonDecode(message);
      print('Received message from server: ${data['message']}');
    },
    onError: (error) {
      print('Error occurred: $error');
    },
    onDone: () {
      print('Connection closed');
    },
  );

  // 向服务器发送消息
  channel.sink.add(jsonEncode({'message': 'Hello Server'}));

  // 关闭连接
  // 注意:在实际应用中,你可能需要根据业务逻辑来决定何时关闭连接
  // await channel.close();
}

创建完整的Flutter Demo

为了更好地理解sse_channel的工作方式,我们创建一个完整的Flutter应用程序示例。这个示例将包括UI部分和后台逻辑。

主文件 lib/main.dart

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

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

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

class SSEPage extends StatefulWidget {
  @override
  _SSEPageState createState() => _SSEPageState();
}

class _SSEPageState extends State<SSEPage> {
  late SseChannel channel;
  List<String> messages = [];

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

  Future<void> connectToSSE() async {
    channel = await SseChannel.connect(Uri.parse('http://127.0.0.1:8080/sseHandler'));

    channel.stream.listen(
      (message) {
        setState(() {
          messages.add('Received: ${jsonDecode(message)['message']}');
        });
      },
      onError: (error) {
        print('Error occurred: $error');
      },
      onDone: () {
        print('Connection closed');
      },
    );

    // 发送初始化消息给服务器
    channel.sink.add(jsonEncode({'message': 'Client connected'}));
  }

  @override
  void dispose() {
    channel.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SSE Channel Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            Expanded(
              child: ListView.builder(
                itemCount: messages.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text(messages[index]),
                  );
                },
              ),
            ),
            ElevatedButton(
              onPressed: () {
                // 向服务器发送新消息
                channel.sink.add(jsonEncode({'message': 'New message from client'}));
              },
              child: Text('Send Message to Server'),
            ),
          ],
        ),
      ),
    );
  }
}

总结

通过上述代码,你可以看到如何使用sse_channel包在Flutter应用中实现与服务器的SSE通信。这不仅简化了开发过程,还提高了代码的可读性和维护性。希望这个指南对你有所帮助!

如果你有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter服务器发送事件(SSE)通信插件sse_channel的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter服务器发送事件(SSE)通信插件sse_channel的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,使用sse_channel插件可以实现服务器发送事件(Server-Sent Events, SSE)通信。sse_channel插件允许Flutter应用接收从服务器推送的实时更新。以下是一个示例,展示了如何使用sse_channel插件进行SSE通信。

1. 添加依赖

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

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

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

2. 创建SSE客户端

在你的Flutter应用中,创建一个SSE客户端来连接到服务器并接收事件。以下是一个简单的示例:

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

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

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

class _MyAppState extends State<MyApp> {
  SSEChannel? _sseChannel;
  List<String> _events = [];

  @override
  void initState() {
    super.initState();
    // 连接到SSE服务器
    _sseChannel = SSEChannel('http://your-sse-server-url/endpoint');

    // 监听服务器发送的事件
    _sseChannel!.stream.listen((event) {
      setState(() {
        _events.add(event.data);
      });
    }, onError: (error) {
      print('SSE error: $error');
    }, onDone: () {
      print('SSE connection closed');
    });
  }

  @override
  void dispose() {
    // 关闭SSE连接
    _sseChannel?.close();
    super.dispose();
  }

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

3. 服务器设置(示例)

为了确保这个示例完整,这里提供一个简单的Node.js服务器示例,它使用expressexpress-sse库来发送SSE事件:

const express = require('express');
const sse = require('express-sse');
const app = express();
const port = 3000;

app.use(sse());

app.get('/endpoint', sse((req, res) => {
  let i = 0;
  const interval = setInterval(() => {
    res.send(`Event ${++i}: Hello, this is a server-sent event!`);
    if (i >= 10) { // 只发送10个事件作为示例
      clearInterval(interval);
      res.end();
    }
  }, 1000);
}));

app.listen(port, () => {
  console.log(`SSE server running at http://localhost:${port}`);
});

总结

以上代码展示了如何在Flutter应用中使用sse_channel插件进行SSE通信。客户端连接到指定的SSE服务器URL,并监听来自服务器的事件,然后将这些事件显示在列表中。同时提供了一个简单的Node.js服务器示例来发送SSE事件。

请确保将http://your-sse-server-url/endpoint替换为你的实际SSE服务器URL。

回到顶部