Обновите пользовательский интерфейс в Flutter с Websocket, если приложение находится в фоновом режиме

#android #flutter #websocket #flutter-dependencies #mobile-application

Вопрос:

Я создаю приложение для Android в Flutter. Таким образом, в принципе, некоторая часть моего пользовательского интерфейса зависит от ответа, который я получаю от веб-сайта. Все работает нормально, когда приложение работает на переднем плане, но когда приложение находится в фоновом режиме, я получаю ответы от WebSocket, но пользовательский интерфейс не меняется. Что я должен сделать, чтобы пользовательский интерфейс приложения изменился, когда оно находится в фоновом режиме?

Вот код для websocket:

 WebSocketHelperService sockets = new WebSocketHelperService();

class WebSocketHelperService {
  WebSocketChannel _channel;
  ObserverList<Function> _listeners = new ObserverList<Function>();
  final streamController = StreamController.broadcast();

  Timer timer;

  wserror(err) async {
    print(new DateTime.now().toString()   " Connection error: $err");
    await reconnect();
  }

  reconnect() async {
    if (timer != null) {
      timer.cancel();
    }
    if (_channel != null) {
      print("Web socket have been disconnected");
      reset();
      await Future.delayed(Duration(seconds: 4));
    }
    print(new DateTime.now().toString()   " Starting connection attempt...");
    _channel = IOWebSocketChannel.connect(webSocketUrl,
        pingInterval: Duration(seconds: 3));
    print(new DateTime.now().toString()   " Connection attempt completed.");
    timer = Timer.periodic(Duration(seconds: 3),
        (Timer t) async => await sockets.send(json.encode({"type": "cm-rp"})));
    _channel.stream.listen((data) {
      streamController.add(data);
      print(data);
    }, onDone: reconnect, onError: wserror, cancelOnError: false);
  }

  // Closes the WebSocket communication
  reset() {
    if (_channel != null) {
      if (_channel.sink != null) {
        _channel.sink.close();
      }
    }
  }

  // Sends a message to the server
  send(String message) async {
    if (_channel != null) {
      if (_channel.sink != null) {
        debugPrint(message);
        _channel.sink.add(message);
      }
    }
  }
}
 

Вот как я использую websocket для изменения пользовательского интерфейса:

 return StreamBuilder(
  stream: sockets.streamController.stream,
  builder: (context, snapshot){
    if(snapshot.hasData){
      var snapBody = jsonDecode(snapshot.data);
    }
    return Text(
      snapshot.hasData ? snapBody['something'] : "Name"
    );
  }
);