Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Flatter Web-http StreamdResponse作为客户端接收SSE_Flutter_Dart - Fatal编程技术网

Flutter Flatter Web-http StreamdResponse作为客户端接收SSE

Flutter Flatter Web-http StreamdResponse作为客户端接收SSE,flutter,dart,Flutter,Dart,有一个flifter应用程序,在手机上运行时能够接收SSE文本/事件流事件,但在chrome web上运行时不能接收相同的SSE文本/事件流事件 import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { http.Client _clien

有一个flifter应用程序,在手机上运行时能够接收SSE文本/事件流事件,但在chrome web上运行时不能接收相同的SSE文本/事件流事件

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

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

class MyApp extends StatelessWidget {

  http.Client _client;

  MyApp() : super() {
    print("Ctor called");
    subscribe();
  }

  @override
  Widget build(BuildContext context) {
    print("building..");
    return MaterialApp(
      title: 'Flutter SSE',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Receive SSE Events'),
        ),
        body: Center(
          child: Text('Ready for events..'),
        ),
      ),
    );
  }

  subscribe() async {
    print("Subscribing..");
    try {
      _client = http.Client();

      var request = new http.Request("GET", Uri.parse("http://192.168.1.11:8080/myserver/events"));
      request.headers["Cache-Control"] = "no-cache";
      request.headers["Accept"] = "text/event-stream";

      Future<http.StreamedResponse> response = _client.send(request);
      print("Subscribed!");

      response.asStream().listen((streamedResponse) {
        print("Received streamedResponse.statusCode:${streamedResponse.statusCode}");
        streamedResponse.stream.listen((data) {
          print("Received data:$data");
        });
      });
    } catch(e) {
      print("Caught $e");
    }
  }

  unsubscribe() {
    _client.close();
  }
}
但仍在经历同样的行为,即作为移动应用程序运行时可以接收流式事件,但作为Chrome web应用程序运行时无法接收流式事件

---更新2---

我一直在读到在web浏览器上运行CORS时可能会出现问题,但据我所知,CORS没有问题。服务器端的CORS已配置为接受所有来源(即
“*”
),配置为接受
“GET”
“OPTIONS”
方法,并配置为接受所有头(即
“*”

在Chrome浏览器中调试显示响应返回为200,并且可以看到以下响应标题:

Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Type: text/event-stream;charset=UTF-8
Expires: 0
Pragma: no-cache
transfer-encoding: chunked
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1 ; mode=block
不幸的是,我对http协议了解不够,所以我不知道上面的响应头是否应该成为关注web浏览器上无法接收事件流的原因

作为旁注,颤振/飞镖代码最初是作为angulardart/飞镖代码编写的,该代码在Chrome web浏览器上运行时能够很好地接收流式事件(因此假设CORS配置正确)

在此问题上的任何帮助或建议都将不胜感激。在Chrome上当前版本的Flatter web中,即使是简单的“是”接收流式事件也是可能的,因此您一定是在服务器端做错了什么。或者“不”,这在Chrome上当前版本的Flitter web中不起作用,但最终它将/永远不会起作用,等等

Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Type: text/event-stream;charset=UTF-8
Expires: 0
Pragma: no-cache
transfer-encoding: chunked
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1 ; mode=block