Я хочу, чтобы мое приложение запомнило статус кнопки «Нравится» после ее закрытия / повторного открытия. Я использую firebase db и flutter.
Запомните статус кнопки Like после повторного открытия во Flutter
- Где вы храните статус кнопки лайк? 08.06.2019
- Я собираюсь использовать общие настройки, но не знаю, подходит это или нет. 08.06.2019
- @Hasini Это зависит от того, для чего нужна кнопка «Нравится»? Это ключевая часть приложения? Если это так, я бы сказал, что общие настройки приемлемы для чего-то в этом роде. В противном случае вам следует подумать о том, как вы храните / собираетесь хранить другие данные. 08.06.2019
- @Hasini SharedPreferences хранятся локально. Это означает, что когда пользователь удаляет приложение или очищает данные для него, все SharedPreferences будут потеряны. Так что это зависит от того, чего вы хотите. Если пользователь взаимодействует с другими людьми, вам следует подумать об использовании облачной базы данных или, возможно, даже онлайн-файла JSON. В противном случае вы могли бы просто использовать SharedPreferences или локальное хранилище. Отредактируйте свой вопрос, объяснив, какой тип приложения вы создаете или чего пытаетесь достичь. 08.06.2019
- @AlexLushiku Я разрабатываю простое приложение для публикации сообщений. 08.06.2019
- @Hasini В этом случае я рекомендую использовать Firestore, посмотрите ответ Али ниже 08.06.2019
Ответы:
Я предполагаю, что вы используете Cloud Firestore, тогда вам может потребоваться правильно структурировать данные в базе данных, но я дам вам пример, чтобы все заработало.
Предположим, что структура документов в Firestore похожа на "posts"/postId
, где "posts"
- это коллекция, а postId
представляет собой общий документ внутри коллекции сообщений, где у каждого сообщения есть кнопка "Нравится".
Теперь мы можем структурировать пользовательский документ в Firestore следующим образом:
uid: //(here goes the postId, you should also name the document by the same postId)
likedBy: //(This is an array of userId's, where if the user likes this post his Id will be placed here)
Обратите внимание, что вам необходимо аутентифицировать пользователей и получать их идентификаторы, если это не функция в вашем приложении, то, возможно, вам нужно использовать общие настройки, как кто-то заявил.
Затем во флаттере нужно проверить, понравился ли пост пользователю. Я не буду рассказывать вам, как структурировать архитектуру вашего приложения, но чтобы узнать, нравится ли пользователю сообщение с кнопкой «Нравится» или нет, можно использовать следующий асинхронный код Dart:
bool isPostLiked;
Future<DocumentSnapshot> docSnapshot = Firestore.instance.collection('posts').document(postId).get();
DocumentSnapshot doc = await docSnapshot;
if (doc['likedBy'].contains(userId)) {
isPostLiked = true;
} else {
isPostLiked = false;
}
Спасибо, Али Амин, сэр. Я следовал его указаниям. Я использовал этот код для обновления поля «Нравится».
Firestore.instance.runTransaction((transaction) async {
DocumentSnapshot freshSnap = await transaction.get(document.reference);
await transaction.update(freshSnap.reference, {
'vote': freshSnap['vote'] + 1,
});
List<String> users = ["4"]; //userId
await transaction.update(freshSnap.reference, {
'likedby': FieldValue.arrayUnion(users),
});
});
Это не связано с Firestore. Но если кто-то пришел сюда, чтобы узнать, как это сделать с базой данных SQL, MySQL, см. Пример ниже. Я объясню это новичкам во Flutter.
Переменная: этот парень будет управлять всем.
bool _isLiked = false;
Виджет initState: здесь вы должны проверить состояние с вашим сервером. Если пользователю это уже понравилось, вы можете показать, что он ему уже понравился.
@override
void initState() {
super.initState();
if(widget.replyData.isLiked == 1){
setState(() {
_isLiked = true;
});
}
}
Кнопка "Мне нравится":
Theme(
data: ThemeData(splashColor: Colors.red[200]),
child: Material(
elevation: 0,
shape: CircleBorder(),
clipBehavior: Clip.hardEdge,
color: Colors.transparent,
child: InkWell(
child: Padding(
padding: const EdgeInsets.all(10),
child: Icon(
Icons.favorite,
color: _isLiked ? Colors.red : Colors.black12,
size: 20,
),
),
onTap: () {
if(_isLiked){
setState(() {
_isLiked = false;
//Here you need to update the backend status(if user dislike). This depends on your architecture.
_replyRateManager(widget.replyData.replyId,_currentUser,"DELETE_REPLY_RATE");
_rateCount -= 1;
});
}else{
setState(() {
_isLiked = true;
//Here you need to update the backend status(if user like). This depends on your architecture.
_replyRateManager(widget.replyData.replyId,_currentUser,"ADD_REPLY_RATE");
_rateCount += 1;
});
}
},
),
),
)
Конечный результат:
likedBy
подколлекции вposts
и заполнение ее идентификаторами пользователя, но это будет намного дороже, так как масштабируемость стоит дороже. Однако заданный вопрос не оправдал бремени структурирования ФС. 14.01.2021