如何关闭 ChangeNotifier Provider Flutter 中的函数

Posted

技术标签:

【中文标题】如何关闭 ChangeNotifier Provider Flutter 中的函数【英文标题】:How to close Functions in ChangeNotifier Provider Flutter 【发布时间】:2020-12-17 21:09:12 【问题描述】:

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

【问题讨论】:

我没明白。您能否用示例代码 sn-p 描述您的问题,以便我们更好地帮助您? 我添加了更多信息 【参考方案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();

【讨论】:

是的,我像那个伙伴那样做的,我在谷歌上找到的!无论如何,谢谢! 我知道取消在上下文中起作用。但我也找不到在 chagennotifier 中取消它们以将我的逻辑与 UI 分开的方法。我不喜欢这样在前端处理它。我在这里有同样的问题***.com/questions/69866719/…

以上是关于如何关闭 ChangeNotifier Provider Flutter 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ChangeNotifier 中使用 Futures?

如何在 Navigator 中传递 ChangeNotifier?

ChangeNotifier 安装等效?

如何显示来自 ChangeNotifier 模型的对话框

我如何从类扩展 ChangeNotifier 中获取价值

如何将计时器添加到 changenotifier 类