Firebase 颤振:每当屏幕打开时自动运行一个功能
我想在每次加载屏幕时运行一个函数来检查Firestore数据。 这是我的密码: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 _
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());
}
},
);