Flutter StreamSubscription не останавливается и не останавливается - PullRequest
0 голосов
/ 27 февраля 2019

В моем приложении флаттера StreamSubscription не приостанавливается и не отменяется.когда я звоню cancel(), если он начинается раньше, чем остановится.Если я позвоню cancel() после запуска, он не остановится.Я использую прослушиватель снимков Firestore.Ниже как мой код.Я пробовал другой метод, но не работает.проблема в том, что пожарный магазин listener не останавливается после загрузки данных.

    StreamSubscription<QuerySnapshot> streamSubscription;

    @override
    void initState() {
    super.initState();

        print("Creating a streamSubscription...");
        streamSubscription =Firestore.collection("name").document("d1").collection("d1")
            .snapshots().listen((data){
                //It will display items
            }, onDone: () { // Not excecuting
                print("Task Done");
            }, onError: (error) {
                print("Some Error");
        });


         streamSubscription.cancel(); //It will work but cancel stream before loading



    }

    @override
    void dispose() {
     streamSubscription.cancel(); //Not working
    super.dispose();
    }

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы не назначаете подписку на нужную переменную.

StreamSubscription<QuerySnapshot> subscription;

@override
void initState() {
super.initState();

    print("Creating a streamSubscription...");
    subscription=Firestore.collection("name").document("d1").collection("d1")
        .snapshots().listen((data){
            //It will display items
        }, onDone: () { // Not excecuting
            print("Task Done");
        }, onError: (error) {
            print("Some Error");
    });


     subscription.cancel(); //It will work but cancel stream before loading



}

@override
void dispose() {
 subscription.cancel(); //Not working
super.dispose();
}
0 голосов
/ 27 февраля 2019

Когда вы нажимаете на новую страницу, предыдущая страница по-прежнему отображается, и поэтому dispose() не вызывается.

Также иногда может случиться, что виджет больше не отображается, но dispose еще не был вызван, что может привести к странным сообщениям об ошибках.Поэтому добавление такой проверки, вероятно, также является хорошей идеей, если вы используете dispose.

Изменить

//It will display items

на

if(myIsCurrentRoute && mounted) {
  //It will display items
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...