Bad state: Stream has already been listened to
Я только недавно начал изучать flutter
У меня следующая логика приложения, есть страница авторизации, я ввожу необходимые данные при нажатие на кнопку я навесил 2 функции 1. получение данных сессии и id пользователя через http
httpPostSignIn() async {
try {
var response = await http.post(
Uri.parse('https://api.test.im/app/user/login/'),
headers: <String, String>{
'Content-Type': 'application/x-www-form-urlencoded',
},
body: {'login': _userLogin!, 'password': _userPassword!},
);
print("Response status: ${response.statusCode}");
print("Response body: ${response.body}");
global.sessionId = jsonDecode(response.body)['data']['session_id'];
global.userId = jsonDecode(response.body)['data']['id'];
return response;
} catch (error) {
print("Error $error");
}
}
и уже на основание данных сессии и id пользователя я создаю сокет соединение с которым и должен постоянно работать.
createSocketConnect() {
var sessionId = Uri.encodeComponent(global.sessionId);
global.channel = IOWebSocketChannel.connect('wss://test.im/ws/ws?UserID=${global.userId}&SessionId=$sessionId&PlatformId=android');
//Запрос списка контактов
global.channel.sink.add('{"Name":10,"Params":{},"Id":"id2"}');
}
После идет переход на основную страницу с вкладками
PrimaryButton(
text: 'Sign in',
press: () async {
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
await httpPostSignIn();
createSocketConnect();
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => MainScreen(),
),
);
}
},
),
на вкладке списка контактов я реализую StreamBuilder которые вещается на сокет соединение и получает список контактов.
child: StreamBuilder(
stream: global.channel.stream,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.none) {
return Center(
child: Text('Please check your internet connection'),
);
} else if (!snapshot.hasData) {
return Center(child: CircularProgressIndicator());
}
if (json.decode(snapshot.data)[0]['event'] == 8) {
String _snapshotData = snapshot.data;
var data = json.decode(_snapshotData)[0]['data'];
return ListView.builder(
itemCount: data.length,
itemBuilder: (context, index) =>
ChatCard(
chat: data[index],
press: () {
//Запрос данных переписки
global.channel.sink.add('{"Name":5,"Params":{channel_url:${data[index]['id']}},"Id":"id11"}');
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MessagesScreen(),
),
);
},
),
);
}
return Center(child: CircularProgressIndicator());
},
),
Но при переходе на другую вкладку и обратно у меня выходит ошибка Bad state: Stream has already been listened to.