実現したいこと
- エラーを解消させて、適切ないいね機能を実現させたい。
前提
FlutterでSNSを開発しており、Twitterのようないいね機能を開発中に以下の問題が発生しました。
発生している問題・エラーメッセージ
カレントユーザーがlikedCountを1プラスすると、isLikedがtrue状態になり、 カレントユーザーがlikedCountを1マイナスすると、isLikedがfalse 状態になることを想定しているが、カレントユーザーがlikedCountを1プラスしてもisLikedがfalse状態になる時がある。
該当のソースコード
like_button.dart
1import 'package:chat_app/model/post.dart'; 2import 'package:cloud_firestore/cloud_firestore.dart'; 3import 'package:flutter/cupertino.dart'; 4import 'package:flutter/foundation.dart'; 5import 'package:flutter/material.dart'; 6 7class LikeButton extends StatefulWidget { 8 final Post post; 9 const LikeButton({super.key, required this.post}); 10 11 @override 12 State<LikeButton> createState() => _LikeButtonState(); 13} 14 15class _LikeButtonState extends State<LikeButton> { 16 late bool isLiked; 17 18 @override 19 void initState() { 20 super.initState(); 21 isLiked = widget.post.likedUserIds.contains(widget.post.postAccountId); 22 if (kDebugMode) { 23 print("isLiked: $isLiked"); 24 print("widget.post.postAccountId: ${widget.post.postAccountId}"); 25 print("widget.post.likedUserIds: ${widget.post.likedUserIds}"); 26 } 27 } 28 29 void toggleLike() async { 30 setState(() { 31 List<String> updatedLikedUserIds = List.from(widget.post.likedUserIds); 32 if (kDebugMode) { 33 print("postAccountId: ${widget.post.postAccountId}"); 34 print("likedUserIds: ${widget.post.likedUserIds}"); 35 } 36 if (isLiked) { 37 widget.post.likedUserIds.remove(widget.post.postAccountId); 38 widget.post.likedCount--; 39 } else { 40 widget.post.likedUserIds.add(widget.post.postAccountId); 41 widget.post.likedCount++; 42 } 43 widget.post.likedCount = widget.post.likedUserIds.length; 44 if (kDebugMode) { 45 print("updatedLikedUserIds: $updatedLikedUserIds"); 46 print("widget.post.likedUserIds: ${widget.post.likedUserIds}"); 47 } 48 isLiked = !isLiked; 49 }); 50 51 try { 52 final ref = 53 FirebaseFirestore.instance.collection('posts').doc(widget.post.id); 54 55 final updateData = { 56 'liked_count': FieldValue.increment(isLiked ? -1 : 1), 57 'liked_user_ids': isLiked 58 ? FieldValue.arrayRemove([widget.post.postAccountId]) 59 : FieldValue.arrayUnion([widget.post.postAccountId]), 60 }; 61 62 await ref.update(updateData); 63 if (kDebugMode) { 64 print("Firestore data updated successfully"); 65 } 66 } on FirebaseException catch (e) { 67 if (kDebugMode) { 68 print("Firestore update error: $e"); 69 } 70 } 71 } 72 73 @override 74 Widget build(BuildContext context) { 75 return IconButton( 76 icon: Icon( 77 Icons.favorite, 78 color: isLiked 79 ? const Color.fromRGBO(255, 100, 130, 1) 80 : CupertinoColors.systemGrey, 81 ), 82 onPressed: toggleLike, 83 ); 84 } 85} 86 87
post.dart
1import 'package:chat_app/model/account.dart'; 2import 'package:cloud_firestore/cloud_firestore.dart'; 3 4class Post { 5 String? id; 6 String? postImagePath; 7 String postContent; 8 String postAccountId; 9 Account? postAccount; 10 Timestamp? postTime; 11 int likedCount; 12 late List<String> likedUserIds; 13 14 Post({ 15 required this.id, 16 required this.postImagePath, 17 required this.postContent, 18 required this.postAccountId, 19 required this.postAccount, 20 required this.postTime, 21 this.likedCount = 0, 22 List<String>? initialLikedUserIds, 23 }) : likedUserIds = initialLikedUserIds ?? []; 24} 25
試したこと
1、like_button.dartの51から70行目をコメントアウトしてisLikedの状態を確認したところ、正常な挙動だったので、trycatchで問題が発生していることを特定。
2、likedUserIdsはその投稿にいいねをしたユーザーのIDを格納している変数だが、現在その投稿の投稿ユーザーのIDが格納されるようになっており、それが原因?という過程をしていますが、有識者の方々にアドバイスをいただきたいと考えています。
3、有識者の方にfireStoreのfieldValueを使用すればDBの値に齟齬が出ないのでは?というアドバイスを受けて、コードを変更中です。
https://skill-upupup-future.com/?p=1114
4、常にtrueの状態に入っていることが問題なのでは?と考えているが、何をどうすれば良いかが考えつきそうで考えつかない状態です。
5、30~49行目をコメントアウトして再実行すると、常にfalse状態に入ることを確認。
補足情報(FW/ツールのバージョンなど)
[✓] Flutter (Channel stable, 3.10.5, on macOS 13.4 22F66 darwin-x64,
locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version
32.1.0-rc1)
[✓] Xcode - develop for iOS and macOS (Xcode 14.3.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.2)
[✓] VS Code (version 1.79.2)
[✓] Connected device (3 available)
[✓] Network resources
現在の状況

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。