es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear un API de transmisión para Flutter para suscribirse.

Estoy tratando de obtener mensajes de una API que construí en express en Flutter.

La cosa es que, para obtener mis mensajes, tuve que construir un StreamBuilder porque quiero que la lista de mensajes se actualice con nuevos mensajes. Para lograr esto, creé un método de streaming que revisa la API cada x segundos.

  Stream<List<Message>> streamMessage() async* {
    final storage = FlutterSecureStorage();
    var json = (await storage.read(key: 'user'))!;
    User user = User.fromJson(jsonDecode(json));
    jwt = user.jwt;

yield* Stream.periodic(const Duration(seconds: 3), (_) async {
  http.Response response = await http.get(
      Uri.parse("https://miapi.com/mensajes"),
      headers: {
        'Authorization': 'Bearer $jwt',
      });

  List<Message> mensajes = [];
  if (response.statusCode == 200) {
    var lista = List.from(jsonDecode(response.body)).reversed;
    mensajes = lista.map((e) => Message.fromJson(e)).toList();
  } else {
    log("Error : ${response.statusCode} -- ${response.reasonPhrase}");
  }
  return mensajes;
}).asyncMap(
  (value) async => await value,
);
}

Funciona, pero tiene muchos problemas.
– La actualización no es tan rápida como quiero
– Hay muchas solicitudes innecesarias
– La API se puede sobrecargar fácilmente
– Esta forma parece más un truco que una función real

Me gustaría crear un mecanismo en mi backend que funcione más como una suscripción real de transmisión. Como funciona con Firebase. Pero no tengo idea de cómo funciona eso, ni siquiera qué buscar.

Si tienes alguna pista, ¿cómo puedo lograr esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una aproximación que podrías seguir para lograr actualizaciones en tiempo real sin depender de un StreamBuilder y llamadas periódicas a la API es implementar websockets en tu backend utilizando una biblioteca como Socket.io. Esto permitiría que tu frontend establezca una conexión continua con el backend y reciba actualizaciones en tiempo real a medida que son enviadas desde el servidor.

    Para implementar esto con Flutter, podrías utilizar una biblioteca de websockets como web_socket_channel para crear una conexión websocket a tu backend. Luego, en tu backend, configurarías un servidor Socket.io para manejar las conexiones y los datos entrantes. Cuando se crea un nuevo mensaje en tu backend, podrías utilizar Socket.io para enviar el mensaje actualizado a todas las conexiones de websockets activas.

    En general, esto reduciría la cantidad de llamadas innecesarias a la API y proporcionaría actualizaciones más rápidas y eficientes para tu aplicación.

Comments are closed.