Я пытаюсь обновить историю и просмотреть историю так же, как 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
Моя база данных: