Flutter 禁用颤振中的图标按钮
我想根据“flag”变量中存储的值禁用图标按钮 这是我的代码: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) {
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,