Настройте веб-приложение flutter для передачи данных любым подписанным слушателям с помощью sse

#flutter #dart #flutter-web #server-sent-events

Вопрос:

В настоящее время я разрабатываю веб-приложение flutter и хотел бы реализовать функцию трансляции данных json любым слушателям/подписчикам.

Чтобы дать более подробную информацию:

  • Веб-приложение имеет сервер переднего плана flutter, работающий на локальном хосте. Пользователь сможет получить некоторые данные JSON с внешнего внутреннего сервера, используя простой запрос GET.
  • Как только приложение загрузит данные JSON, ему потребуется передать их по потоку SSE любым слушателям. Этот прослушиватель будет отдельным приложением flutter.

Теперь я понимаю, что с этим есть несколько проблем.

  1. Во-первых, Flutter web не поддерживает dart:io… Отлично — мне удалось обойти это, используя пакет universal_io dart вместо dart:io. Api тот же, и после устранения нескольких ошибок CORS работает заклинание для запросов GET в первом пуле выше. Это означает, что данные json могут быть успешно загружены в приложение Flutter.

(пакет universal_io для дротиков -> >https://pub.dev/packages/universal_io).

  1. Следующая проблема связана с SSE. Часть первая заключается в том, что существует не так много документации по реализации сервера SSE во Flutter — только клиент, который может прослушивать. Тем не менее, мне удалось найти решение в примере приложения sse dart package…
 import 'package:shelf/shelf_io.dart' as io;
import 'package:sse/server/sse_handler.dart';

/// A basic server which sets up an SSE handler.
///
/// When a client connnects it will send a simple message and print the
/// response.
void main() async {
  var handler = SseHandler(Uri.parse('/sseHandler'));
  await io.serve(handler.handler, 'localhost', 0);
  var connections = handler.connections;
  while (await connections.hasNext) {
    var connection = await connections.next;
    connection.sink.add('foo');
    connection.stream.listen(print);
  }
}
 

(пакет дротиков sse -> >https://pub.dev/packages/sse)

  1. (продолжение) Обычно это было бы прекрасным решением, и его, вероятно, можно было бы немного изменить для реализации в приложении flutter. Однако пакет shelf_io.dart, используемый для запуска сервера, зависит от пакета dart:io, который не работает с Flutter Web.
  2. The other thought is — why do we need to set up a new server connection (with io.server(…)) when the flutter web app is already running on its own localhost server? This begs the question: Is there a way to add this sseHandler endpoint onto the localhost server that the Flutter Web app is running on?

All in all, what i’m trying to ask is:
Is there a way for a Flutter Web App to send SSE messages to a collection of listeners?

На данный момент я немного зашел в тупик с исследованиями по этому вопросу, так что, если у кого-нибудь были какие-либо яркие идеи о потенциальном решении, то помощь была бы очень признательна. Спасибо 🙂

Примечание: Очевидно, что это то, что очень легко можно было бы сделать с помощью Java, J2Html и так далее, но в чем смысл просто так сдаваться?.. С другой стороны, может быть, flutter web все еще слишком нова, чтобы поддерживать подобные вещи?