Как обновить и просмотреть историю так же, как WhatsApp из базы данных Firestore с флаттером? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь обновить историю и просмотреть историю так же, как WhatsApp.

Прежде всего, я добавил историю в таблицу Firestore UsersInfo с вложенной коллекцией с именем Статус с их полями [StoryTime, storyData, storyType, creatorUid] затем извлек все данные из initState().

Проблемы:

1St: обратите внимание на историю времени, в которую она меняется, когда я перехожу на другую страницу и возвращаюсь на страницу истории или выполняю горячий перезапуск. из-за того, что я извлек данные истории в initState.

2nd: , когда я добавил историю, то не отображается в списке рассказов, но он показывает, когда переходишь на другую страницу, затем возвращаешься или делаешь Горячий перезапуск

3-й: и получение исключений при изначально:

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: setState() called after dispose(): _GroupChatListScreenState#991f0(lifecycle state: defunct, not mounted)

Код:

List<StatusModel> listModelNextTwo =[];

@override
 void initState() {
   super.initState();
   firestore.collection("UsersInfo").where("isAddedStory", isEqualTo:"1").getDocuments().then((mainSnapshot){
     for(int i =0 ; i<mainSnapshot.documents.length;i++){
       print("mainSnapshot.documents.length_getlength${mainSnapshot.documents.length}");
       List<BaseModel> baseModel =[];
         print("baseModelllllllllllllLENGTHAT_Initial:${baseModel.length}");
         firestore.collection("UsersInfo").document(mainSnapshot.documents[i].data['uid']).collection("Status").getDocuments().then((snapshot){
           print("snapshot.documents.length_getlength${snapshot.documents.length}");
           for(int k = 0 ; k<snapshot.documents.length; k++){
             dynamic stotyTime;
             dynamic timeDifference = DateTime.now().difference(DateTime.parse((snapshot.documents[k].data['StatusTime']))).inHours;  
             if(timeDifference >= 1){
               stotyTime = timeDifference.toString()+" hours ago";
             }else{
               stotyTime = DateTime.now().difference(DateTime.parse((snapshot.documents[k].data['StatusTime']))).inMinutes;  
               if(stotyTime>=1 ){
                 stotyTime = stotyTime.toString()+" minutes ago";
               }else{
                 stotyTime = "Just now";
               }
             }

             if(timeDifference < 24){
               baseModel.add(
                 BaseModel( //0
                   storyData: snapshot.documents[k].data['StatusData'],
                   colorData: Colors.teal,//
                   storyDate: stotyTime.toString(),
                   storyType: snapshot.documents[k].data['DataType']
                 ),
               );
               print("baseModelllllllllllllllIF$i$k:${baseModel.length}");
             }else{
               Fluttertoast.showToast(msg: "above 24 hours$k");
               firestore.collection("UsersInfo").document(mainSnapshot.documents[i].data['uid'])
               .collection("Status").document(snapshot.documents[k].documentID).delete();
             } 
           }
           print("baseModelllllllllllllllFINAl_LOOP_EnD ${baseModel.length}");
           if(baseModel.length > 0){
             setState(() {
             this.listModelNextTwo.add(
               StatusModel( //0
                 storyCreatorName: mainSnapshot.documents[i].data['name'],
                 baseModel: baseModel,
                 userImage: mainSnapshot.documents[i].data['UserProfileImage'],
               ),
             );
             print("listModelNextTwoooooooooooooooooooooooo$i ${listModelNextTwo.length}");
             });
           }
         });
     }
   });
 }

да I пробовал StreamBuilder, но есть проблема с этим, значит Story ничего не показывал, потому что listModelNextTwo.length =0 прокомментировал эти строки кода.

StreamBuilder ():

StreamBuilder(
          stream: firestore.collection("UsersInfo").where("isAddedStory", isEqualTo:"1").snapshots(),
          builder: (context,snapshot){
            if(snapshot.hasError) return Center(child: Container(child: Text(snapshot.error),),);
            if(!snapshot.hasData) {
              return Center(child: Container(child: Text(snapshot.error),),);
            }else{
            //    listModelNextTwo = [];
            //   List<DocumentSnapshot> docs = snapshot.data.documents;

            //  for(int i =0 ; i<docs.length;i++){
            //   List<BaseModel> baseModel =[];
            //      firestore.collection("UsersInfo").document(docs[i].data['uid']).collection("Status").getDocuments().then((snapshot){
            //       for(int k = 0 ; k<snapshot.documents.length; k++){
            //         dynamic  stotyTime;  
            //         dynamic timeDifference = DateTime.now().difference(DateTime.parse((snapshot.documents[k].data['StatusTime']))).inHours;  
            //         if(timeDifference >= 1){
            //           stotyTime = timeDifference.toString()+" hours ago";
            //          }else{
            //            stotyTime = DateTime.now().difference(DateTime.parse((snapshot.documents[k].data['StatusTime']))).inMinutes;  
            //          if(stotyTime>=1 ){
            //            stotyTime = stotyTime.toString()+" minutes ago";
            //           }else{
            //             stotyTime = "Just now";
            //           }
            //          }
            //         if(timeDifference < 24){
            //           baseModel.add(
            //             BaseModel( //0
            //               storyData: snapshot.documents[k].data['StatusData'],
            //               colorData: Colors.teal,//
            //               storyDate: stotyTime
            //               storyType: snapshot.documents[k].data['DataType'],
            //               //(DateFormat('dd-MM-yyyy hh:mm a').format(snapshot.documents[k].data['StatusTime'].toDate())).toString().split(" ")[1]
            //             ),
            //           );      
            //         }else{
            //         Fluttertoast.showToast(msg: "above 24 hours$k");
            //         }       
            //       }
            //       if(baseModel.length > 0){
            //         listModelNextTwo.add(
            //           StatusModel( //0
            //             storyCreatorName: docs[i].data['name'],
            //             baseModel: baseModel,
            //             userImage: docs[i].data['UserProfileImage'],           
            //           ),
            //         );
            //         print("listModelNextTwoooooooooooooooooooooooo$i ${listModelNextTwo.length}");
            //       }
            //     });
            //   }

              if(listModelNextTwo.length>0){
                return ListView.builder(
                  itemCount: listModelNextTwo.length,
                  itemBuilder: (context, index){
                    final List<StoryItem> storiesNext  = List<StoryItem>();
                    for(int k=0; k< listModelNextTwo[index].baseModel.length; k++){
                     if(listModelNextTwo[index].baseModel[k].storyType == "Image"){
                        storiesNext.add(
                          StoryItem.pageImage(

                            CachedNetworkImageProvider(listModelNextTwo[index].baseModel[k].storyData,
                            ),
                            caption: "beautiful"

                          )
                        );
                      }
                      else if(listModelNextTwo[index].baseModel[k].storyType == "PaintedImage"){
                        List<int> list = listModelNextTwo[index].baseModel[k].storyData.codeUnits;
                        Uint8List bytes = Uint8List.fromList(list);
                        storiesNext.add(
                          StoryItem.pageImage(
                            MemoryImage(bytes),
                            caption: ""

                          )
                      );
                      }else
                      storiesNext.add(
                        StoryItem.text(
                          listModelNextTwo[index].baseModel[k].storyData,
                          listModelNextTwo[index].baseModel[k].colorData,
                          fontSize: 25
                        ),
                      );
                    }
                    return Column(
                      children: <Widget>[
                        ListTile(
                          leading:Container(
                            height: 60,
                            width: 60,
                            alignment: Alignment.center,
                            child:Text(listModelNextTwo[index].storyCreatorName[0]),
                            decoration: BoxDecoration(
                              shape: BoxShape.circle,
                              color: Colors.blue,

                            ),
                          ),
                          title:  Text(listModelNextTwo[index].storyCreatorName),
                          subtitle:Text(listModelNextTwo[index].baseModel[0].storyDate),
                          onTap: (){
                            Navigator.of(context).push(MaterialPageRoute(builder: (context)=>ViewStatus(
                              stories:storiesNext, 
                              storyCreatorName: listModelNextTwo[index].storyCreatorName,
                              userImage: listModelNextTwo[index].userImage,
                              )));
                          },
                        ),
                        Divider(color:Colors.grey)
                      ],
                    );
                  },
                );
              }else{
                return Center(child: Container(child: Text("No Status yet Added"),),);
              }
            }
          },
        ),

Класс StoryModel:

class StatusModel{
  final String storyCreatorName;
  final List<BaseModel> baseModel;
  final String userImage;

  StatusModel({ this.storyCreatorName,this.baseModel,this.userImage, });
}


class BaseModel{
  String storyData;
  Color colorData;
  String storyDate;
  String storyType;
  BaseModel( {this.storyData,this.colorData,this.storyDate,this.storyType});
}

Посмотрите на это изображение Gif

enter image description here

Моя база данных: enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...