firebase - 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
设置为active
,Join
按钮将被禁用,并且要重新启用它们需要按下以检查条件。但这是不可能的,因为按钮被禁用时无法按下。我想在checkUserStatus()
每次PlaceTile
加载此页面时运行。我怎样才能做到这一点?一个代码片段会很有帮助。
解决方案
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());
}
},
);
}
推荐阅读
- c++ - 我将消息长度声明为什么?整数还是字符?
- powershell - 如何使用 Powershell 正则表达式将 "" 转换为 \"?
- selenium-webdriver - 如何获取 id 的 xpath
- mysql - 当我进行快速数据库导出时,如何找到 phpMyAdmin 运行的 MySQL 命令?
- amazon-web-services - 如果 S3 存储桶的账户所有者将其设为只读,同一账户所有者可以撤消此操作吗?
- angular7 - 用逗号 angular7 / ionic4 显示价格小数点后 2 位
- python - 错误消息:TypeError:需要一个类似字节的对象,而不是在 Python 中使用 Pickle 接收到的“str”
- python - 使用 set_table_styles() 时,如何将格式应用于具有多级列索引的数据框?
- jquery - 在 HTML 模板中选择元素并附加到正文
- javascript - 如何使用 Firebase 函数检查 Firebase 实时数据库中是否存在值?