【问题标题】:Flutter - How to change the color of an icon through boolean return?Flutter - 如何通过布尔返回更改图标的颜色?
【发布时间】:2019-03-31 22:01:59
【问题描述】:

我有一个函数可以检查 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】:

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

    建议:

    • State 类中创建属性 bool isFavorite
    • 将您的方法 isFavorite() 更改为 _loadFavorite()
    • _loadFavorite() 中,不返回值,而是使用setState() 更新属性isFavorite
    • 致电_loadFavorite()initState()

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

    如果您愿意,您可以将 listen 附加到 firestore 引用以监控它是否被更改,如果发生更改,您也可以使用 setState() 更新状态。

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多