#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"
);
}
);