首页 > 解决方案 > Flutter:每当打开屏幕时自动运行一个函数

问题描述

我想在每次加载屏幕时运行一个函数来检查 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,
            ),
          ),
        )
    );
    }
}

当前状态的代码没有按我预期的方式执行。这实际上是一个谬论。一旦flag设置为activeJoin按钮将被禁用,并且要重新启用它们需要按下以检查条件。但这是不可能的,因为按钮被禁用时无法按下。我想在checkUserStatus()每次PlaceTile加载此页面时运行。我怎样才能做到这一点?一个代码片段会很有帮助。

标签: firebasefluttergoogle-cloud-firestoremobile-application

解决方案


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());
    }
  },
);

}


推荐阅读