簡體   English   中英

Flutter GetX 標記 controller 數據更新

[英]Flutter GetX tagged controller data update

首先我不知道我面對的是什么,但我會盡力解釋情況。 我正在嘗試構建聊天應用程序,我在同一頁面上有兩個部分。 這兩個不同的部分在同一個ListView中呈現。 唯一改變的是我用來提供ListView的數據。 我需要實時獲取用戶狀態,所以我為每個在列表視圖中呈現的圖塊放置了標記控制器。 問題來了。 在同一索引處呈現的圖塊不會顯示其自身的真實狀態,直到該圖塊上發生某些 state 更改,例如任何Stack項目的 position。

這是代碼。

在這部分我渲染ListView

ListView.builder(
              itemCount: chatController.currentChats!.length,
              itemBuilder: (context, index) {
                  return GetBuilder<UserOnlineController>(
                    global: false,
                    init: Get.find<UserOnlineController>(tag: chatController.currentUserID == chatController.currentChats![index].user1 ? chatController.currentChats![index].user2 : chatController.currentChats![index].user1),
                    builder: (userController) {
                      return  Stack(
                    children: [
                      Positioned(
                        child: Container(
                          color: Colors.black,
                          width: Get.width,
                          height: Dimensions.h100,
                          child: Center(
                            child: Text(
                              "${userController.user!.name!}",
                              style: TextStyle(
                                color: Colors.white
                              ),
                            ),
                          ),
                        )
                      )
                    ],
                  );
                    }
                  );
              }),

這是我放置控制器和實時收聽聊天的部分。

 void listenChats() async {
    var chatController = Get.find<ChatController>();
    var messagesController = Get.find<MessagesController>();
    

    String userID = Get.find<SharedPreferenceService>().getUserID();
    var currentUserDoc =  (await firestoreService.getCollection('users').where('userID', isEqualTo: userID).get()).docs[0];

    Stream<DocumentSnapshot> userStream = firestoreService.getCollection('users').doc(currentUserDoc.id).snapshots();
    Stream<QuerySnapshot> chatStream = firestoreService.getCollection('chats').snapshots();
    
    await for(var user in userStream){
      
      var userObject = UserModel.fromJson(user.data() as Map<String,dynamic>);

      await for(var chats in chatStream) {
        List<Chat> activeChats = [];
        List<Chat> unActiveChats = [];
        List<Chat> newMatches = [];
        List<Chat> allChats = [];
        
        var filteredChats = chats.docs.where((chat) => userObject.chat!.active_chats!.contains(chat['chatID'])).toList();
        filteredChats.forEach((chatDoc) { 
          var currentChat = Chat.fromJson(chatDoc.data() as Map<String,dynamic>);

          if(currentChat.user1 == userID){
            Get.put(
              UserOnlineController(firestoreService: firestoreService, userID: currentChat.user2!),
              tag: currentChat.user2!,
              
            );
          }
          else{
             Get.put(
              UserOnlineController(firestoreService: firestoreService, userID: currentChat.user1!),
              tag: currentChat.user1!
            );
          }
          allChats.add(currentChat);

          if(currentChat.isActive!){
                        
            if(currentChat.isStarted!){
              activeChats.add(currentChat);
            }
            else{                            
              newMatches.add(currentChat);
            }
          }
          else{
            unActiveChats.add(currentChat);
          }          
        });
        
        

        messagesController.generatePositions(activeChats.length, true);
        messagesController.generatePositions(unActiveChats.length, false);

        chatController.setAllChats(allChats);
        chatController.setCurrentChats();
        
        
        chatController.setChats(activeChats, unActiveChats, newMatches);
      }



      
    }



  }

這是我用來控制 UI 的部分 state


  void setAllChats(List<Chat> allChats) {
    _allChats = allChats;
  }

  void setCurrentChats() {
    _currentChats = _allChats!.where((chat) => chat.isActive! == isActiveMessages).toList();
    update();
  }



  void setIsActiveMessages(bool state){        
    _isActiveMessages = state;
    _currentChats = _allChats!.where((chat) => chat.isActive! == state).toList();
    update();
  }

在此處輸入圖像描述

在此處輸入圖像描述

在上面的圖片中,所有這些用戶都是不同的,但真正的用戶是第二個屏幕截圖中的第三個用戶。

再次您好這個問題基本上解釋了所有細節。 帶有 GetX 標簽的多實例在 flutter 中不起作用

基本上你需要添加關鍵參數。

 GetBuilder<UserChatController>(
                key: Key(currentUserControllerTag),
                tag: currentUserControllerTag,
                global: false,
                init: Get.find<UserChatController>(tag: currentUserControllerTag),              
                builder: (controller) {
                  return controller.user != null ? Container(
                      width: Get.width,
                      height: Dimensions.h100,
                      child:  Stack(
                      children: [
                        Positioned(
                          left: 0,
                          right: 0,
                          child: Container(
                            height: Dimensions.h100,
                            width: double.maxFinite,
                            color: Colors.black,
                            child:Center(
                              child: Text(
                                controller.user != null ? controller.user!.name! :  "",
                                style: TextStyle(
                                  color: Colors.white
                                ),
                              ),    
                          
                          )
                        ))
                      ],
                    ),
                    ) : Container();
                },
              )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM