I used Firebase queries so that when someone clicks the like button, it goes to the ‘sendHearts’ field, and conversely, when someone receives a like, it goes to the ‘receivedHearts’ field. However, as soon as I click the like button, it goes to the wrong place. here is my code.
//receivedLike
Widget _receivedHearts(BuildContext context) {
final db = FirebaseFirestore.instance;
final uid = FirebaseAuth.instance.currentUser?.uid;
return StreamBuilder(
stream: db
.collection(AppKeys.users)
.where('receivedHearts', arrayContains: uid)
.snapshots(),
builder: (context, snapshot) {
// print(snapshot);
print(uid);
print('snapshot : ${snapshot.data}');
List<UsersModel> user = [];
for (var docSnapshot in snapshot.data?.docs ?? []) {
print('snapshot : ${snapshot.data?.docs}');
user.add(UsersModel.fromDocument(docSnapshot));
}
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return CircularProgressIndicator();
default:
return Container(
// sendLike
Widget _sendHeart(BuildContext context) {
final db = FirebaseFirestore.instance;
final uid = FirebaseAuth.instance.currentUser?.uid;
return StreamBuilder(
stream: db
.collection(AppKeys.users)
.where('sentHearts', arrayContains: uid)
.snapshots(),
builder: (context, snapshot) {
List<UsersModel> user = [];
for (var docSnapshot in snapshot.data?.docs ?? []) {
user.add(UsersModel.fromDocument(docSnapshot));
}
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return CircularProgressIndicator();
default:
return Container(
It seems like there’s no problem, even though I’ve checked it multiple times. And I’ve also checked the database, but it seems like everything is going in correctly.
Future<void> likePost(
BuildContext context, UsersModel item, bool isLike) async {
final uid = FirebaseAuth.instance.currentUser?.uid;
try {
await FirebaseFirestore.instance
.collection(AppKeys.users)
.doc(item.id)
.update(
{
'receivedHearts': FieldValue.arrayUnion([uid])
// print(doc['sentHearts']);
},
);
await FirebaseFirestore.instance
.collection(AppKeys.users)
.doc(uid)
.update(
{
'sentHearts': FieldValue.arrayUnion([item.id]),
},
);
print('sent 값 : ${item.sentHearts}');
print('receive 값 : ${item.receivedHearts}');
} catch (e) {
print(e);
}
}
Future<void> dislikePost(
BuildContext context, UsersModel item, bool isLike) async {
final uid = FirebaseAuth.instance.currentUser?.uid;
try {
await FirebaseFirestore.instance
.collection(AppKeys.users)
.doc(item.id)
.update(
{
'receivedHearts': FieldValue.arrayRemove([uid])
},
);
await FirebaseFirestore.instance
.collection(AppKeys.users)
.doc(uid)
.update(
{
'sentHearts': FieldValue.arrayRemove([item.id]),
},
);
// print('receive 값 : ${item.receivedHearts}');
} catch (e) {
print(e);
}
}
And this is the button logic.
GestureDetector(
onTap: () async {
// bool isLike = item.sentHearts?.contains(uid) ?? false;
bool newLikeState = !isLike;
if (newLikeState) {
print(
'newlike : $newLikeState');
try {
await likePost(context,
item, isLike);
print(' : $isLike');
setState(() {
isLike = newLikeState;
});
} catch (e) {
print('faild: $e');
}
} else {
try {
await dislikePost(context,
item, isLike);
print(
'dislike : $isLike');
setState(() {
isLike = !newLikeState;
});
} catch (e) {
print('failed: $e');
}
}
print('final like : $isLike');
},
child: isLike
? SvgPicture.asset(
'assets/icons/smallHeart_on.svg')
: SvgPicture.asset(
'assets/icons/smallHeart.svg'),
)
The button is behaving strangely. The “like” is definitely being stored accurately in the database. I really don’t know what’s wrong. I urgently need help!