#flutter #dart #flutter-web #server-sent-events
Вопрос:
В настоящее время я разрабатываю веб-приложение flutter и хотел бы реализовать функцию трансляции данных json любым слушателям/подписчикам.
Чтобы дать более подробную информацию:
- Веб-приложение имеет сервер переднего плана flutter, работающий на локальном хосте. Пользователь сможет получить некоторые данные JSON с внешнего внутреннего сервера, используя простой запрос GET.
- Как только приложение загрузит данные JSON, ему потребуется передать их по потоку SSE любым слушателям. Этот прослушиватель будет отдельным приложением flutter.
Теперь я понимаю, что с этим есть несколько проблем.
- Во-первых, Flutter web не поддерживает dart:io… Отлично — мне удалось обойти это, используя пакет universal_io dart вместо dart:io. Api тот же, и после устранения нескольких ошибок CORS работает заклинание для запросов GET в первом пуле выше. Это означает, что данные json могут быть успешно загружены в приложение Flutter.
(пакет universal_io для дротиков -> >https://pub.dev/packages/universal_io).
- Следующая проблема связана с 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)
- (продолжение) Обычно это было бы прекрасным решением, и его, вероятно, можно было бы немного изменить для реализации в приложении flutter. Однако пакет shelf_io.dart, используемый для запуска сервера, зависит от пакета dart:io, который не работает с Flutter Web.
- 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 все еще слишком нова, чтобы поддерживать подобные вещи?