Как закрыть функции во Flutter провайдера ChangeNotifier

Как закрыть функцию, не удаляя ее. Мне нужен этот ответ, потому что, когда я выхожу из системы, мне нужно закрыть функции в классе ChangeNotifier.

Это мой класс ChangeNotifier:

class ChatAndRequestProvider extends ChangeNotifier {
  bool _areThereNewChatsAndRequests = false;
  bool get areThereNewChatsAndRequests => _areThereNewChatsAndRequests;
  set areThereNewChatsAndRequests(bool value) {
    _areThereNewChatsAndRequests = value;
    notifyListeners();
  }

  List _chatsList = [];
  List get chatsList => _chatsList;

  set chatsList(List list) {
    _chatsList = list;
    notifyListeners();
  }

  getChats() async {
    var prefs = await SharedPreferences.getInstance();
    print('The getChats Id is ${prefs.getString(kUserId)}');
    FirebaseDatabase.instance
        .reference()
        .child('users')
        .child(prefs.getString(kUserId))
        .child('friendsArray')
        .onValue
        .listen((snapshot) {
      Map list = snapshot.snapshot.value;
      print('map is $list');
      var newItems = [];
      if (list != null) {
        list.forEach((key, value) {
          newItems.add(value);
        });
        chatsList = newItems;
        var globalArray = [];
        for (var item in newItems) {
          if (item[kLastTimestamp] != item[kLastTimestampSeen]) {
            areThereNewChatsAndRequests = true;
          }
          var status;
          switch (item['friendsStatus']) {
            case 'friends':
              status = RequestStatus.alreadyAFriend;
              break;
            case 'notFriends':
              status = RequestStatus.noRequest;
              break;
            case 'blocked':
              status = RequestStatus.userThatBlockedMe;
              break;
            case 'unblocked':
              status = RequestStatus.noRequest;
              break;
          }
          globalArray.add({kUserId: item[kUserId], kTypeOfRequest: status});
        }
        valuesList = globalArray;
      } else {
        deleteFromList(null, RequestStatus.alreadyAFriend);
        chatsList = [
          {kUserId: 'null'}
        ];
      }
    });
  }

Так, например, когда я вхожу в систему как user1 и вызываю эту функцию в LoadingScreen(), я получаю всех пользователей, которые являются моими друзьями, и могу перейти к списку экрана чатов и пообщаться с друзьями. До этого момента нет никаких проблем. Но когда я выхожу из системы и когда я вхожу в систему с другой учетной записью, скажем, user2, и я снова вызываю эту функцию, я получаю сообщение об ошибке и два ответа, потому что я вызываю эту функцию дважды. Я не использую Auth Packet, у меня есть собственная база данных на MongoDB, где я храню информацию о пользователе, но запросы и чаты хранятся в базе данных RealTime. Итак, мой вопрос: когда user1 выходит из моего приложения, я не могу вызвать dispose() для провайдера, потому что, если он захочет снова войти в другую учетную запись, он получит сообщение об ошибке, потому что Provider был удален, так как я могу перестать слушать в мою базу данных, когда пользователь выходит из системы и снова вызывает эту функцию. Большое спасибо!!

1 ответ

Решение

Я не уверен, что это работает, потому что я не совсем понимаю, как работает ваше приложение, но вы говорите, что

Я не могу вызвать dispose() для провайдера, потому что, если он захочет снова войти в другую учетную запись,

когда пользователи выходят из системы, разве приложение не должно возвращаться к первому экрану, удаляя поставщик? (если вы не создадите его в MaterialApp, я тоже в этом не уверен). Вы можете сохранить экземпляр прослушивателя Firebase, а затем закрыть его при выходе из системы / удалении поставщика.

var _myListener;

getChats() async {
    var prefs = await SharedPreferences.getInstance();
    print('The getChats Id is ${prefs.getString(kUserId)}');
    _myListener = FirebaseDatabase.instance
        .reference()
        .child('users')
        .child(prefs.getString(kUserId))
        .child('friendsArray')
        .onValue
        .listen((snapshot) ...
        ....
        /// The rest of your code
}

void closeListener(){ //call it when the user logs out
   _myListener?.close();
}

@override
void dispose(){
  closeListener(); // or call it in the dispose if you want 
                   //to dispose and create a new provider when the user logs out/ sign in
  super.dispose();
}
Другие вопросы по тегам