Flutter - Как изменить цвет иконки с помощью логического возврата? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть функция, которая проверяет, какие книги предпочитаются в Firestore, на экране книги есть значок звезды, я использую функцию isFavorite, чтобы проверить, является ли открытая книга предпочтительной для пользователя или нет, если так, то она возвращает true изначок должен изменить свой цвет на желтый, в противном случае он возвращает значение false, а цвет должен быть черным, но цвет не меняется.

Функция updateFavorite отлично работает, добавляя и удаляя любимую книгу из Firestore при касаниизначок.

InkWell(
          child: Icon(
            Icons.star,
            size: 30,
            color: isFavorite == true ? Colors.yellow
            : Colors.black,
          ),
          onTap: (){

            model.updateFavorite(model.getUserId(), document.documentID);
          },
        ),

==============

Future<bool> isFavorite() async{

            firebaseUser = await _auth.currentUser();

            DocumentSnapshot favoritesRef = await Firestore.instance.collection("users")
                .document(firebaseUser.uid).get();

            if(favoritesRef.data["favorites"].contains(document.documentID)){

              return true;
            }
            else {

              return false;
            }

          }

==============

      Future<bool> updateFavorite(Future<DocumentReference> uid, String bookId) async{

        firebaseUser = await _auth.currentUser();

        DocumentReference favoritesRef = Firestore.instance.collection("users")
            .document(firebaseUser.uid);

        return Firestore.instance.runTransaction((Transaction tx) async{

          DocumentSnapshot postSnapshot = await tx.get(favoritesRef);
          if(postSnapshot.exists){

            if(!postSnapshot.data["favorites"].contains(bookId)){
              await tx.update(favoritesRef, <String, dynamic>{
                "favorites": FieldValue.arrayUnion([bookId])

              });
              // Delete de bookId from Favorites
            } else {
              await tx.update(favoritesRef, <String, dynamic>{
                "favorites": FieldValue.arrayRemove([bookId])
              });

            }

          }

        }).then((result){
          print(firebaseUser.uid);
          print(bookId);
          return true;

        }).catchError((error){
          print("Error: $error");

          return false;
        });

      }

1 Ответ

0 голосов
/ 01 апреля 2019

Я бы порекомендовал вам не использовать isFavorite() напрямую, как это build. Метод build может вызываться постоянно, и он должен иметь все необходимые данные сразу. (а отсутствие данных должно быть связано, например, с анимацией загрузки)

Предложение:

  • сделайте собственность bool isFavorite в вашем State классе
  • измените свой метод isFavorite() на _loadFavorite()
  • in _loadFavorite(), вместо того, чтобы возвращать значение, обновите свойство isFavorite, используя setState()
  • вызов _loadFavorite() в initState()

Для значения по умолчанию для isFavorite вы можете определить его как initState(), вы можете установить значение по умолчанию, например false ИЛИ оставить его null, и в вашем методе build выполните проверку, если это null, тогда не отображается, например, Icon (или даже значок загрузки).

При желании вы можете дополнительно listen обратиться к справке пожарного депо, чтобы следить за его изменением, и если это так, вы также можете обновить состояние, используя setState().

...