[英]Flutter - Firebase - Cant get data
It's my notification page on my social media app, but when i open that page it does not show anything, just working (circularProgress()) which is mean there is no data in database, but there is a data.这是我在社交媒体应用程序上的通知页面,但是当我打开该页面时,它没有显示任何内容,只是在工作 (circularProgress()),这意味着数据库中没有数据,但有数据。 It just cant get that data, Could you please help me about it?它只是无法获取该数据,您能帮我解决一下吗?
I tried to update everything.我试图更新所有内容。 My flutter version is 1.24.0-3.0.pre我的flutter版本是1.24.0-3.0.pre
There is no problem about connection between app and database because i can get another data at another pages.应用程序和数据库之间的连接没有问题,因为我可以在另一个页面获取另一个数据。
Is it related or not I dont know but I got this error:它是否相关我不知道但我收到此错误:
6.26.0 - [Firebase/Firestore][I-FST000001] WatchStream (6000010b0818) Stream error: 'Unavailable: Operation timed out' [VERBOSE-2:profiler_metrics_ios.mm(186)] Error retrieving thread information: (os/kern) invalid argument 6.26.0 - [Firebase/Firestore][I-FST000001] WatchStream (6000010b0818) Stream 错误:“不可用:操作超时”[VERBOSE-2:profiler_metrics_ios.mm(186)] 检索线程信息时出错:(os/kern)无效的论点
This one is my previous code which is similar to original one but it does not work.这是我以前的代码,与原始代码相似,但不起作用。
import 'package:pga/pages/home.dart';
import 'package:pga/pages/post_screen.dart';
import 'package:pga/pages/profile.dart';
import 'package:pga/widgets/header.dart';
import 'package:pga/widgets/progress.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:timeago/timeago.dart' as timeago;
class ActivityFeed extends StatefulWidget {
@override
_ActivityFeedState createState() => _ActivityFeedState();
}
class _ActivityFeedState extends State<ActivityFeed> {
getActivityFeed() async {
QuerySnapshot snapshot = await activityFeedRef
.doc(currentUser.id)
.collection('feedItems')
.orderBy('timestamp', descending: true)
.limit(50)
.get();
List<ActivityFeedItem> feedItems = [];
snapshot.docs.forEach((doc) {
feedItems.add(ActivityFeedItem.fromDocument(doc));
//print('Activity Feed Item: ${doc.data}');
});
return feedItems;
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white70,
appBar: header(context, titleText: "Bildirimler"),
body: Container(
child: FutureBuilder(
future: getActivityFeed(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return circularProgress();
} else {
return ListView(
children: snapshot.data,
);
}
},
)),
);
}
}
Widget mediaPreview;
String activityItemText;
class ActivityFeedItem extends StatelessWidget {
final String username;
final String userId;
final String type; // 'like', 'follow', 'comment'
final String mediaUrl;
final String postId;
final String userProfileImg;
final String commentData;
final Timestamp timestamp;
ActivityFeedItem({
this.username,
this.userId,
this.type,
this.mediaUrl,
this.postId,
this.userProfileImg,
this.commentData,
this.timestamp,
});
factory ActivityFeedItem.fromDocument(DocumentSnapshot doc) {
return ActivityFeedItem(
username: doc['username'],
userId: doc['userId'],
type: doc['type'],
postId: doc['postId'],
userProfileImg: doc['userProfileImg'],
commentData: doc['commentData'],
timestamp: doc['timestamp'],
mediaUrl: doc['mediaUrl'],
);
}
showPost(context) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PostScreen(
postId: postId,
userId: userId, //currentUser.id,
),
),
);
}
configureMediaPreview(context) {
if (type == "like" || type == 'comment') {
mediaPreview = GestureDetector(
onTap: () => showPost(context),
child: Container(
height: 50.0,
width: 50.0,
child: AspectRatio(
aspectRatio: 16 / 9,
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: CachedNetworkImageProvider(mediaUrl),
),
),
)),
),
);
} else {
mediaPreview = Text('');
}
if (type == 'like') {
activityItemText = "Gönderini Beğendi";
} else if (type == 'follow') {
activityItemText = "Seni Takip Ediyor";
} else if (type == 'comment') {
activityItemText = "Yorum Yaptı: $commentData";
} else {
activityItemText = "Error: Unknown type '$type'";
}
}
@override
Widget build(BuildContext context) {
configureMediaPreview(context);
return Padding(
padding: EdgeInsets.only(bottom: 2.0),
child: Container(
color: Colors.white54,
child: ListTile(
title: GestureDetector(
onTap: () => showProfile(context, profileId: userId),
child: RichText(
overflow: TextOverflow.ellipsis,
text: TextSpan(
style: TextStyle(
fontSize: 14.0,
color: Colors.black,
),
children: [
TextSpan(
text: username,
style: TextStyle(fontWeight: FontWeight.bold),
),
TextSpan(
text: ' $activityItemText',
),
]),
),
),
leading: CircleAvatar(
backgroundImage: CachedNetworkImageProvider(userProfileImg),
),
subtitle: Text(
timeago.format(timestamp.toDate()),
overflow: TextOverflow.ellipsis,
),
trailing: mediaPreview,
),
),
);
}
}
showProfile(BuildContext context, {String profileId}) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Profile(
profileId: profileId,
)));
}
And this one is my updated code after @Lakshmi Narayanan suggestion, which is still not working.这是我根据@Lakshmi Narayanan 建议更新的代码,但仍然无法正常工作。
import 'package:pga/pages/home.dart';
import 'package:pga/pages/post_screen.dart';
import 'package:pga/pages/profile.dart';
import 'package:pga/widgets/header.dart';
import 'package:pga/widgets/progress.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:timeago/timeago.dart' as timeago;
class ActivityFeed extends StatefulWidget {
@override
_ActivityFeedState createState() => _ActivityFeedState();
}
class _ActivityFeedState extends State<ActivityFeed> {
List<ActivityFeedItem> feedItemsList = [];
int feedCount = 0;
getActivityFeed() async {
QuerySnapshot snapshot = await activityFeedRef
.doc(currentUser.id)
.collection('feedItems')
.orderBy('timestamp', descending: true)
.limit(50)
.get();
List<ActivityFeedItem> feedItems = [];
snapshot.docs.forEach((doc) {
feedItems.add(ActivityFeedItem.fromDocument(doc));
});
return feedItems;
}
feedItems() {
return Container(
child: FutureBuilder(
future: getActivityFeed(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return circularProgress();
} else {
return ListView(
children: snapshot.data,
);
}
},
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white70,
appBar: header(context, titleText: "Bildirimler"),
body: ListView(
shrinkWrap: true,
children: <Widget>[
feedItems(),
],
),
);
}
}
Widget mediaPreview;
String activityItemText;
class ActivityFeedItem extends StatelessWidget {
final String feedId;
final String username;
final String userId;
final String type; // 'like', 'follow', 'comment'
final String mediaUrl;
final String postId;
final String userProfileImg;
final String commentData;
final Timestamp timestamp;
ActivityFeedItem({
this.feedId,
this.username,
this.userId,
this.type,
this.mediaUrl,
this.postId,
this.userProfileImg,
this.commentData,
this.timestamp,
});
factory ActivityFeedItem.fromDocument(DocumentSnapshot doc) {
return ActivityFeedItem(
username: doc['username'],
userId: doc['userId'],
type: doc['type'],
postId: doc['postId'],
userProfileImg: doc['userProfileImg'],
commentData: doc['commentData'],
timestamp: doc['timestamp'],
mediaUrl: doc['mediaUrl'],
feedId: doc['feedId']);
}
showPost(context) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PostScreen(
postId: postId,
userId: userId, //currentUser.id,
),
),
);
}
configureMediaPreview(context) {
if (type == "like" || type == 'comment') {
mediaPreview = GestureDetector(
onTap: () => showPost(context),
child: Container(
height: 50.0,
width: 50.0,
child: AspectRatio(
aspectRatio: 16 / 9,
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: CachedNetworkImageProvider(mediaUrl),
),
),
)),
),
);
} else {
mediaPreview = Text('');
}
if (type == 'like') {
activityItemText = "Hayalini Beğendi";
} else if (type == 'follow') {
activityItemText = "Seni Takip Ediyor";
} else if (type == 'comment') {
activityItemText = "Yorum Yaptı: $commentData";
} else {
activityItemText = "Error: Unknown type '$type'";
}
}
@override
Widget build(BuildContext context) {
configureMediaPreview(context);
return Padding(
padding: EdgeInsets.only(bottom: 2.0),
child: Container(
color: Colors.white54,
child: ListTile(
title: GestureDetector(
onTap: () => showProfile(context, profileId: userId),
child: RichText(
overflow: TextOverflow.ellipsis,
text: TextSpan(
style: TextStyle(
fontSize: 14.0,
color: Colors.black,
),
children: [
TextSpan(
text: username,
style: TextStyle(fontWeight: FontWeight.bold),
),
TextSpan(
text: ' $activityItemText',
),
]),
),
),
leading: CircleAvatar(
backgroundImage: CachedNetworkImageProvider(userProfileImg),
),
subtitle: Text(
timeago.format(timestamp.toDate()),
overflow: TextOverflow.ellipsis,
),
trailing: mediaPreview,
),
),
);
}
}
showProfile(BuildContext context, {String profileId}) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Profile(
profileId: profileId,
)));
}
And this one is the original code which is from my Udemy course.这是我的 Udemy 课程中的原始代码。
import 'package:cached_network_image/cached_network_image.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:fluttershare/pages/home.dart';
import 'package:fluttershare/pages/post_screen.dart';
import 'package:fluttershare/pages/profile.dart';
import 'package:fluttershare/widgets/header.dart';
import 'package:fluttershare/widgets/progress.dart';
import 'package:timeago/timeago.dart' as timeago;
class ActivityFeed extends StatefulWidget {
@override
_ActivityFeedState createState() => _ActivityFeedState();
}
class _ActivityFeedState extends State<ActivityFeed> {
getActivityFeed() async {
QuerySnapshot snapshot = await activityFeedRef
.document(currentUser.id)
.collection('feedItems')
.orderBy('timestamp', descending: true)
.limit(50)
.getDocuments();
List<ActivityFeedItem> feedItems = [];
snapshot.documents.forEach((doc) {
feedItems.add(ActivityFeedItem.fromDocument(doc));
// print('Activity Feed Item: ${doc.data}');
});
return feedItems;
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.orange,
appBar: header(context, titleText: "Activity Feed"),
body: Container(
child: FutureBuilder(
future: getActivityFeed(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return circularProgress();
}
return ListView(
children: snapshot.data,
);
},
)),
);
}
}
Widget mediaPreview;
String activityItemText;
class ActivityFeedItem extends StatelessWidget {
final String username;
final String userId;
final String type; // 'like', 'follow', 'comment'
final String mediaUrl;
final String postId;
final String userProfileImg;
final String commentData;
final Timestamp timestamp;
ActivityFeedItem({
this.username,
this.userId,
this.type,
this.mediaUrl,
this.postId,
this.userProfileImg,
this.commentData,
this.timestamp,
});
factory ActivityFeedItem.fromDocument(DocumentSnapshot doc) {
return ActivityFeedItem(
username: doc['username'],
userId: doc['userId'],
type: doc['type'],
postId: doc['postId'],
userProfileImg: doc['userProfileImg'],
commentData: doc['commentData'],
timestamp: doc['timestamp'],
mediaUrl: doc['mediaUrl'],
);
}
showPost(context) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PostScreen(
postId: postId,
userId: userId,
),
),
);
}
configureMediaPreview(context) {
if (type == "like" || type == 'comment') {
mediaPreview = GestureDetector(
onTap: () => showPost(context),
child: Container(
height: 50.0,
width: 50.0,
child: AspectRatio(
aspectRatio: 16 / 9,
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: CachedNetworkImageProvider(mediaUrl),
),
),
)),
),
);
} else {
mediaPreview = Text('');
}
if (type == 'like') {
activityItemText = "liked your post";
} else if (type == 'follow') {
activityItemText = "is following you";
} else if (type == 'comment') {
activityItemText = 'replied: $commentData';
} else {
activityItemText = "Error: Unknown type '$type'";
}
}
@override
Widget build(BuildContext context) {
configureMediaPreview(context);
return Padding(
padding: EdgeInsets.only(bottom: 2.0),
child: Container(
color: Colors.white54,
child: ListTile(
title: GestureDetector(
onTap: () => showProfile(context, profileId: userId),
child: RichText(
overflow: TextOverflow.ellipsis,
text: TextSpan(
style: TextStyle(
fontSize: 14.0,
color: Colors.black,
),
children: [
TextSpan(
text: username,
style: TextStyle(fontWeight: FontWeight.bold),
),
TextSpan(
text: ' $activityItemText',
),
]),
),
),
leading: CircleAvatar(
backgroundImage: CachedNetworkImageProvider(userProfileImg),
),
subtitle: Text(
timeago.format(timestamp.toDate()),
overflow: TextOverflow.ellipsis,
),
trailing: mediaPreview,
),
),
);
}
}
showProfile(BuildContext context, {String profileId}) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Profile(
profileId: profileId,
),
),
);
}
There is nothing wrong with the code..代码没有错..
Since I have also worked with this code(Course from Udemy) @Raşid The thing is if a user likes your post,a document gets added into the feed collection in the cloud firestore and then the activityfeed notification will be filled with data.由于我也使用过此代码(来自 Udemy 的课程)@Raşid 事情是如果用户喜欢您的帖子,文档将添加到云 firestore 的提要集合中,然后活动提要通知将填充数据。
How are you testing this out?你如何测试这个?
(OR) (要么)
Ans 1) Go to your post.dart and then comment out(Uncomment it after testing..) Ans 1)Go到你的帖子。dart然后注释掉(测试后取消注释..)
// if (isNotPostOwner) // if (isNotPostOwner)
from both addLikeToActivityFeed() & removeLikeToActivityFeed() then check it out,从 addLikeToActivityFeed() 和 removeLikeToActivityFeed() 然后检查出来,
Ans 2) Try the first one, it should probably be the case. Ans 2)尝试第一个,应该是这样的。 Else, I got no choices..否则,我别无选择..
Try to put this,试着把这个,
feedItems(){
return Container(
child: FutureBuilder(
future: getActivityFeed(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
-------> return circularProgress();
} else {
-------> return ListView(
children: snapshot.data,
);
}
},
),
);
}
in a seperate function and then trying calling it, ie,在单独的 function 中,然后尝试调用它,即
return Scaffold(
body: ListView(
shrinkWrap: true,
children: <Widget>[
feedItems(),
],
),
);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.