Как закрыть функции во 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();
}