微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在onPress颤动之前,如何根据条件更改listView负载上IconButton的颜色?

如何解决在onPress颤动之前,如何根据条件更改listView负载上IconButton的颜色?

我有ListView个帖子,每行或每个帖子都有IconButton个。现在用户可以喜欢任何帖子。我需要检查用户是否喜欢某个帖子,并且该帖子的IconButton会是蓝色的。用户不喜欢的帖子,IconButton颜色为灰色。当帖子列表正在加载时,我需要检查它。

列表:

    children: <Widget> [
        Row(
           children: <Widget>[
           new IconButton(
           icon: new Icon(Icons.thumb_up),// documentId = list[index].id;
           // want to get documentId in this way from here and pass this documentId to the method like  checkPostLikedOrNot(documentId); 
           //  checkFeedLikedOrNot(documentId ); 
           // want to call this method here and check the conditon    
           
          color:(ispressed) ? Color(0xff007397) : Color(0xff9A9A9A),onpressed: (){
             print(widget.userId); // userId
             documentId = list[index].id;
             _counter = list[index].data()["like_count"];
             _incrementCounter(); // updating table with userId in this method
              },),],

检查方法

    checkFeedLikedOrNot(documentId) async{
      DocumentReference docRef = FirebaseFirestore.instance.collection('post').doc(documentId);
      DocumentSnapshot docSnapshot = await docRef.get();
      List likedUser = docSnapshot.data()['liked_user_id'];
      if(likedUser.contains(widget.userId) == true){
         print('user already exist=='+ widget.userId);
         //color will be blue
      }else{
         //color will be grey
    }
  }

构建ListView

return ListView.builder(
                  shrinkWrap: true,primary: false,itemCount: list.length,itemBuilder:(context,index)  {
                    print(index);
                    return Card(
                      elevation: 5,shape: Border(bottom: BorderSide(color: Colors.lightBlue,width: 5)),child: Column(
                            children: <Widget> [
                              ListTile(

我该怎么做?

解决方法

关于提高安全性的说明:您的API应该具有一种方法来检查用户是否喜欢userIdpostId的帖子(或使用userId获取给定Future<bool>的所有喜欢的帖子的ID)分页)。这不是让所有喜欢该帖子的用户的好方法。

您可以使用FutureBuilder

检查方法应返回 Future<bool> checkFeedLikedOrNot(documentId) async { DocumentReference docRef = FirebaseFirestore.instance.collection('post').doc(documentId); DocumentSnapshot docSnapshot = await docRef.get(); List likedUser = docSnapshot.data()['liked_user_id']; return likedUser.contains(widget.userId); }

FutureBuilder

然后您可以使用Icon来获取 Widget getIcon(documentId) { return FutureBuilder<bool>( builder: (BuildContext context,AsyncSnapshot<bool> snapshot) { Color color = Colors.grey; // set proper default color if (snapshot != null && snapshot.connectionState == ConnectionState.done && snapshot.hasData != null) { color = Colors.blue; // set proper "liked" color } return Icon( Icons.thumb_up,color: color,); },future: checkFeedLikedOrNot(documentId),); }

IconButton

并在new IconButton( icon: getIcon(list[index].id),// documentId = list[index].id; // want to get documentId in this way from here and pass this documentId to the method like checkPostLikedOrNot(documentId); // checkFeedLikedOrNot(documentId ); // want to call this method here and check the conditon color:(isPressed) ? Color(0xff007397) : Color(0xff9A9A9A),onPressed: (){ print(widget.userId); // userId documentId = list[index].id; _counter = list[index].data()["like_count"]; _incrementCounter(); // updating table with userId in this method },),

中使用此方法
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                //Your task it will execute at 1 time only...
                onBackPressed();{
                    if (webview.isFocused() && webview.canGoBack()) {
                        webview.goBack();  
                    } 

                    if(mRewardedVideoAd.isLoaded()) {
                        mRewardedVideoAd.show();


                    }
                }
            }
        },5000);//5 seconds delay and you can change the delay  time...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。