Squeak.ru - шаблоны программирования

Запомните статус кнопки Like после повторного открытия во Flutter

Я хочу, чтобы мое приложение запомнило статус кнопки «Нравится» после ее закрытия / повторного открытия. Я использую firebase db и flutter.

07.06.2019

  • Где вы храните статус кнопки лайк? 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

Ответы:


1

Я предполагаю, что вы используете 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;
}
08.06.2019
  • Это нехорошо! Что, если у него будет около 10 тысяч лайков, может быть, его приложение станет больше. Собирается ли он сделать это на 10к человек? Что, если у него на 1 странице 5 постов, массив из 50к строк? Это определенно переполнение. Ему нужно использовать облачные функции, чтобы создать поле, отслеживающее длину поля на сервере. Затем выполните запрос, чтобы узнать, понравился ли пост пользователю или нет. 11.01.2021
  • @AlexandruStroescu Размер идентификатора документа Firestore составляет 29 байтов (рассчитывается как количество байтов в кодировке UTF-8 + 1 в документации), поэтому, если вы действительно получите 50 тыс. Строк, вы получите менее 1,5 МБ в строковых массивах, так что переполнения здесь нет. Тем не менее, вы правы, что этот подход не масштабируется. Более масштабируемым подходом было бы создание likedBy подколлекции в posts и заполнение ее идентификаторами пользователя, но это будет намного дороже, так как масштабируемость стоит дороже. Однако заданный вопрос не оправдал бремени структурирования ФС. 14.01.2021

  • 2

    Спасибо, Али Амин, сэр. Я следовал его указаниям. Я использовал этот код для обновления поля «Нравится».

    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),
            });
          });
    
    08.06.2019
  • Это сработает, но есть некоторые проблемы с безопасностью. Ему нужны строгие правила безопасности. 11.01.2021

  • 3

    Это не связано с 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;
                         });
                     }
                  },
               ),
            ),
        )
    

    Конечный результат:

    введите описание изображения здесь

    02.09.2020
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...