Flutter 服务器端事件,反应式 UI

C. *_*yle 1 stream server-sent-events dart flutter

我正在尝试让我的应用程序响应 SSE 服务器发送的事件流。该流会出现多种类型的事件,并且仅当我收到的事件类型与该 UI 元素关联时,应用程序的某些部分才会更新。

示例 json 流响应(例如,如果我收到心跳,我不想更改 UI):

event:heartbeat
data:{"type":"heartbeat"}

event:gwy
data:{"a":532289,"lastUpdatedDateInMilliseconds":1587490669503,"t":1587490669503,"g":12479,"api":0,"cellSignalStrength":15}

event:gwy
data:{"a":532289,"lastUpdatedDateInMilliseconds":1587490694685,"t":1587490694685,"g":12479,"api":0,"cellSignalStrength":15}

Run Code Online (Sandbox Code Playgroud)

此数据的格式是全局数据变量的子集(事件应替换全局变量的该部分)。

非常感谢任何指示或资源。

小智 5

我知道您已经找到答案,但如果想要解析流值,这是我使用的代码,它提取事件和实际数据

import "package:http/http.dart";

http.Client client = http.Client();

http.Request request = http.Request("GET", Uri.parse('your url'));
request.headers["Accept"] = "text/event-stream";
request.headers["Cache-Control"] = "no-cache";

Future<http.StreamedResponse> response = client.send(request);
print("Subscribed!");
response.then((streamedResponse) => streamedResponse.stream.listen((value) {
  final parsedData = utf8.decode(value);
  print(parsedData);

  //event:heartbeat
  //data:{"type":"heartbeat"}
        
  final eventType = parsedData.split("\n")[0].split(":")[1];
  print(eventType);
  //heartbeat
  final realParsedData = json.decode(parsedData.split("data:")[1]) as Map<String, dynamic>;
  if (realParsedData != null) {
  // do something
  }
}, onDone: () => print("The streamresponse is ended"),),);
Run Code Online (Sandbox Code Playgroud)