Flutter 禁用颤振中的图标按钮

Flutter 禁用颤振中的图标按钮,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我想根据“flag”变量中存储的值禁用图标按钮 这是我的代码: class PlaceTile extends StatelessWidget { final Place place; PlaceTile({ this.place }); getUserById(String id) { DatabaseService().placesCollection.document(id).get().then((DocumentSnapshot doc) {

我想根据“flag”变量中存储的值禁用图标按钮

这是我的代码:

class PlaceTile extends StatelessWidget {
  

  final Place place;
  PlaceTile({ this.place });

  getUserById(String id) {
    
    DatabaseService().placesCollection.document(id).get().then((DocumentSnapshot doc) {
      print(doc.data);
  
    });

  }

  checkUserStatus() async {
    
     String flag='inactive';

    final FirebaseAuth auth = FirebaseAuth.instance;
    
    final FirebaseUser user  = await auth.currentUser();
    String uid = user.uid;
    UserDatabaseService().userCollection.getDocuments().then((QuerySnapshot snapshot) {
      snapshot.documents.forEach((DocumentSnapshot doc) {
        if(doc.documentID == uid)
        {
          if(doc.data['status']=='true')
          {
              flag = 'active';
          }
        }
        });
    });
    return flag;
  }


  String value;

  @override
  Widget build(BuildContext context) {
    void showQueueDetailsPanel() {
      showModalBottomSheet(context: context, builder: (context) {
        return Container(
          padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 60.0),
          child: QueueDetails(value: place.name),
        );
      });
    }
    return Padding(
      padding: EdgeInsets.only(top: 8.0),
      child: Card(
        margin: EdgeInsets.fromLTRB(20.0, 6.0, 20.0, 0.0),
        child: ListTile(
          isThreeLine: true,
          leading: CircleAvatar(
            radius: 25.0,
            backgroundColor: Colors.white,
          ),
            title: Text(place.name),
            subtitle: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                //Text("People   "+place.totalPeople.toString()),
                Text(""),
                Text("Token    "+place.tokenAvailable.toString()),
              ],
            ),
            
            trailing: FlatButton.icon(
              icon: Icon(Icons.add_box_rounded),
              label: Text('Join'),
              onPressed: checkUserStatus()=='inactive' ?
              () async => showQueueDetailsPanel() : null,
            ),
          ),
        )
    );
    }
}

如果
checkUserStatus()
用作异步函数,则应等待该函数,或通过
访问其值。然后()

您正试图使
无状态的
小部件具有状态。要使代码正常工作,您需要将
无状态
小部件转换为
状态
小部件

您的代码如下所示:


类PlaceTile扩展了StatefulWidget{
最后地点;
PlaceTile({this.place});
@凌驾
_PlaceTileState createState()=>\u PlaceTileState();
}
类PlaceTileState扩展状态{
字符串标志='inactive';
@凌驾
initState(){
super.initState();
checkUserStatus();
}
void getUserById(字符串id){
数据库服务()
.地点收集
.文件(id)
.get()
.然后((文档快照文档){
打印(单据数据);
});
}
Future checkUserStatus()异步{
final FirebaseAuth auth=FirebaseAuth.instance;
final FirebaseUser user=wait auth.currentUser();
字符串uid=user.uid;
UserDatabaseService()
.userCollection
.getDocuments()
.然后((QuerySnapshot快照){
snapshot.documents.forEach((DocumentSnapshot doc){
如果(doc.documentID==uid){
如果(文档数据['status']='true'){
设置状态(){
标志=‘活动’;
});
}
}
});
});
返回标志;
}
void showQueueDetailsPanel(){
showModalBottomSheet(
上下文:上下文,
生成器:(上下文){
返回容器(
填充:边缘组。对称(垂直:20.0,水平:60.0),
子级:QueueDetails(值:widget.place.name),
);
});
}
@凌驾
小部件构建(构建上下文){
返回填充(
填充:仅限边缘设置(顶部:8.0),
孩子:卡片(
边距:LTRB(20.0,6.0,20.0,0.0)中的边距集,
孩子:ListTile(
伊斯特里琳:是的,
领先:CircleAvatar(
半径:25.0,
背景颜色:Colors.white,
),
标题:文本(widget.place.name),
副标题:专栏(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
//Text(“People”+place.totalPeople.toString()),
正文(“”),
Text(“Token”+widget.place.tokenAvailable.toString()),
],
),
尾随:FlatButton.icon(
图标:图标(图标。添加框),
标签:文本('Join'),
onPressed:flag='inactive'?showQueueDetailsPanel:null,
),
),
));
}
}

更新了答案错误是什么?可能是一个愚蠢的问题,但数据中是否设置了标志a?必须从函数返回该标志才能访问该值。如果可以简化上述小部件,或者将其更改为有状态小部件,以便更容易对状态进行推理,则上述小部件相当复杂。这将更容易调试。现在这里发生了很多事情。对不起,我粘贴了原始代码。现在答案应该是正确的。
class PlaceTile extends StatelessWidget {
  

  final Place place;
  PlaceTile({ this.place });

  getUserById(String id) {
    
    DatabaseService().placesCollection.document(id).get().then((DocumentSnapshot doc) {
      print(doc.data);
  
    });

  }

  String checkUserStatus()  {
    
     String flag='inactive';

    final FirebaseAuth auth = FirebaseAuth.instance;
    
    //final FirebaseUser user  = await auth.currentUser();
    auth.currentUser().then((user) {
    String uid = user.uid;
    UserDatabaseService().userCollection.getDocuments().then((QuerySnapshot snapshot) {
      snapshot.documents.forEach((DocumentSnapshot doc) {
        if(doc.documentID == uid)
        {
          if(doc.data['status']=='true')
          {
              flag = 'active';
          }
        }
        });
    });

  });
      return flag;
  }


  String value;

  @override
  Widget build(BuildContext context) {
    void showQueueDetailsPanel() {
      showModalBottomSheet(context: context, builder: (context) {
        return Container(
          padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 60.0),
          child: QueueDetails(value: place.name),
        );
      });
    }
    return Padding(
      padding: EdgeInsets.only(top: 8.0),
      child: Card(
        margin: EdgeInsets.fromLTRB(20.0, 6.0, 20.0, 0.0),
        child: ListTile(
          isThreeLine: true,
          leading: CircleAvatar(
            radius: 25.0,
            backgroundColor: Colors.white,
          ),
            title: Text(place.name),
            subtitle: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                //Text("People   "+place.totalPeople.toString()),
                Text(""),
                Text("Token    "+place.tokenAvailable.toString()),
              ],
            ),
            
            trailing: FlatButton.icon(
              icon: Icon(Icons.add_box_rounded),
              label: Text('Join'),
              onPressed: checkUserStatus()=='inactive' ?
              () async => showQueueDetailsPanel() : null,
            ),
          ),
        )
    );
    }
}
  String checkUserStatus() {
    String flag = 'inactive';

    final FirebaseAuth auth = FirebaseAuth.instance;

    auth.currentUser().then((user) {
      String uid = user.uid;
      UserDatabaseService()
          .userCollection
          .getDocuments()
          .then((QuerySnapshot snapshot) {
        snapshot.documents.forEach((DocumentSnapshot doc) {
          if (doc.documentID == uid) {
            if (doc.data['status'] == 'true') {
              flag = 'active';
            }
          }
        });
      });
      return flag;
    });
  }
onPressed: checkUserStatus() == 'inactive'
                  ? () async => showQueueDetailsPanel()
                  : null,