Flutter 如何关闭ChangeNotifier提供程序中的函数

Flutter 如何关闭ChangeNotifier提供程序中的函数,flutter,dart,flutter-provider,flutter-bloc,flutter-change-notifier,Flutter,Dart,Flutter Provider,Flutter Bloc,Flutter Change Notifier,如何在不处理函数的情况下关闭函数。我需要这个答案,因为当我注销时,我需要关闭ChangeNotifier类中的函数 这是我的ChangeNotifier类: class ChatAndRequestProvider extends ChangeNotifier { bool _areThereNewChatsAndRequests = false; bool get areThereNewChatsAndRequests => _areThereNewChatsAndRequest

如何在不处理函数的情况下关闭函数。我需要这个答案,因为当我注销时,我需要关闭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数据包,我在MongoDB上有自己的数据库,在那里我存储用户信息,但请求和聊天存储在实时数据库中。 所以我的问题是:
当user1注销我的应用程序时,我无法调用provider上的dispose(),因为如果他想再次登录到另一个帐户,他将因为provider已被释放而收到错误,所以当用户注销并再次调用此函数时,我如何停止侦听我的数据库。非常感谢

我不确定这是否有效,因为我不完全了解你的应用程序的流程,但你这么说

我无法对提供程序调用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();
}

我不明白。你能用示例代码片段来描述你的问题吗,这样我们就能更好地帮助你了?我添加了更多的信息是的,我就是这么做的,伙计,我在谷歌上找到的!无论如何谢谢你!