Firebase 颤振:每当屏幕打开时自动运行一个功能

Firebase 颤振:每当屏幕打开时自动运行一个功能,firebase,flutter,google-cloud-firestore,mobile-application,Firebase,Flutter,Google Cloud Firestore,Mobile Application,我想在每次加载屏幕时运行一个函数来检查Firestore数据。 这是我的密码: class PlaceTile extends StatefulWidget { //String flag='inactive'; final Place place; PlaceTile({ this.place }); @override _PlaceTileState createState() => _PlaceTileState(place); } class _

我想在每次加载屏幕时运行一个函数来检查Firestore数据。 这是我的密码:

class PlaceTile extends StatefulWidget {
  
  //String flag='inactive';
  
  final Place place;
  PlaceTile({ this.place });

  @override
  _PlaceTileState createState() => _PlaceTileState(place);
}

class _PlaceTileState extends State<PlaceTile> {

  final Place place;
  _PlaceTileState(this.place);
  String flag = 'inactive';

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

  }

  checkUserStatus() async {
    
    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')
          {
            setState(() {
              flag = 'active';
            });

          }
          else
          {
            setState(() {
              flag = 'inactive';
            });
          }
        }
        });
    });
      return flag;
  }
      void showQueueDetailsPanel() {
      showModalBottomSheet(context: context, builder: (context) {
        return Container(
          padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 60.0),
          child: QueueDetails(value: place.name),
        );
      });
    }

  String value;
  @override
    initState() {
    super.initState();
    checkUserStatus();
  }
  Widget build(BuildContext context) {

    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' ? showQueueDetailsPanel : null,
            ),
          ),
        )
    );
    }
}
class PlaceTile扩展StatefulWidget{
//字符串标志='inactive';
最后地点;
PlaceTile({this.place});
@凌驾
_PlaceTileState createState()=>\u PlaceTileState(地点);
}
类PlaceTileState扩展状态{
最后地点;
_PlaceTileState(这个地方);
字符串标志='inactive';
void getUserById(字符串id){
DatabaseService().placesCollection.document(id).get().then((DocumentSnapshot文档){
打印(单据数据);
});
}
checkUserStatus()异步{
final FirebaseAuth auth=FirebaseAuth.instance;
final FirebaseUser user=wait auth.currentUser();
字符串uid=user.uid;
UserDatabaseService().userCollection.getDocuments().then((QuerySnapshot快照){
snapshot.documents.forEach((DocumentSnapshot doc){
如果(doc.documentID==uid)
{
如果(文档数据['status']=='true')
{
设置状态(){
标志=‘活动’;
});
}
其他的
{
设置状态(){
标志=‘不活动’;
});
}
}
});
});
返回标志;
}
void showQueueDetailsPanel(){
showModalBottomSheet(上下文:上下文,生成器:(上下文){
返回容器(
填充:边缘组。对称(垂直:20.0,水平:60.0),
子级:队列详细信息(值:place.name),
);
});
}
字符串值;
@凌驾
initState(){
super.initState();
checkUserStatus();
}
小部件构建(构建上下文){
返回填充(
填充:仅限边缘设置(顶部:8.0),
孩子:卡片(
边距:LTRB(20.0,6.0,20.0,0.0)中的边距集,
孩子:ListTile(
伊斯特里琳:是的,
领先:CircleAvatar(
半径:25.0,
背景颜色:Colors.white,
),
标题:文本(地点、名称),
副标题:专栏(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
//Text(“People”+place.totalPeople.toString()),
正文(“”),
Text(“Token”+place.tokenAvailable.toString()),
],
),
尾随:FlatButton.icon(
图标:图标(图标。添加框),
标签:文本('Join'),
onPressed:checkUserStatus()='inactive'?showQueueDetailsPanel:null,
),
),
)
);
}
}
当前状态下的代码没有按我期望的方式执行。实际上这是一种谬论。一旦
标志
设置为
活动
,则
加入
按钮将被禁用,要使其重新启用,需要按下按钮以检查条件。但这是不可能的,因为按钮被禁用了,所以无法按下。
每次加载带有
PlaceTile
的页面时,我都要运行
checkUserStatus()。我怎样才能做到这一点?代码片段会很有帮助。

将函数添加到
initState

 @override
  void initState() {
    super.initState();
    checkUserStatus();
  }
小部件构建(构建上下文){
回归未来建设者(
未来:futurePackageListModel,
生成器:(BuildContext上下文,
异步快照(快照){
if(snapshot.hasData){
返回您的widget();
}else if(snapshot.hasrerror){
返回ApiStatusFail();
}否则{
返回中心(子项:CircularProgressIndicator());
}
},
);

}

只要第一次构建小部件,它就会运行。您可以在
返回padding
checkUserStatus()之前将其移动到构建方法中;
Widget build(BuildContext context) {
return FutureBuilder(
  future: futurePackageListModel,
  builder: (BuildContext context,
      AsyncSnapshot<List<Model>> snapshot) {
    if (snapshot.hasData) {
      return YourWidget();
    } else if (snapshot.hasError) {
      return ApiStatusFail();
    } else {
      return Center(child: CircularProgressIndicator());
    }
  },
);