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.


Ответы (0 шт):