颤动 - 如何通过布尔返回更改图标的颜色?

问题描述 投票:0回答:1

我有一个功能,可以检查哪些书在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;
        });

      }
dart flutter google-cloud-firestore boolean
1个回答
0
投票

我建议你不要像isFavorite()那样直接使用buildbuild方法可能会被不断调用,它必须立即拥有所需的所有数据。 (并且必须处理缺少数据,例如,加载动画)

建议:

  • 在你的bool isFavorite课堂上制作一个属性State
  • 将你的方法isFavorite()改为_loadFavorite()
  • _loadFavorite(),而不是返回值,使用isFavorite更新属性setState()
  • _loadFavorite()打电话给initState()

对于isFavorite的默认值,你可以在initState()上定义它,你可以设置一个默认值,如false或保持它null,并在你的build方法进行检查,如果它是null,然后不显示任何Icon,例如(甚至是加载图标)。

如果你愿意,你可以aditionaly listen到firestore引用来监视它是否被更改,如果有,你也可以使用setState()更新状态。

© www.soinside.com 2019 - 2024. All rights reserved.