【发布时间】:2018-09-28 21:49:20
【问题描述】:
在我从 firebase 获取数据后,数据为空,但如果我热重载它工作正常。如果我用问题评论代码行,则代码可以正常工作并将数据正确提交到 firebase
我尝试了许多方法试图将 initState 设置为 setState 但没有用。
我什至认为构建是在从 firebase 获取数据之前完成的,但据我所知,initState 应该可以解决这个问题。我想我在这里遗漏了一些东西。 :(
编辑: 这是我使用 futureBuilder 的新 attemet,仍然在数据之前加载小部件
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_test/flutter_test.dart';
class UnlockDoor extends StatefulWidget {
UnlockDoorState createState() => new UnlockDoorState();
}
class UnlockDoorState extends State<UnlockDoor> {
final formKey = GlobalKey<FormState>();
String building;
String room;
String name;
String email;
DateTime created;
String comment;
String uid;
@override
void initState() {
FirebaseAuth.instance.currentUser().then((FirebaseUser user) {
this.uid = user.uid;
});
Firestore.instance.collection('Users').document(uid).get().then((data) {
this.name = data['Name'];
this.email = data['Email'];
this.building = data['Building'];
this.room = data['Room'];
});
print("uid $uid");
super.initState();
}
void validateAndSubmit() async {
created = DateTime.now();
formKey.currentState.save();
await Firestore.instance
.collection('Requests')
.document('UnlockDoor')
.collection('UnlockDoor')
.document()
.setData({
'Email': email,
'Name': name,
'Building': building,
'Room': room,
'Comment': comment,
'Status': "Pending",
'Created': created,
'Housing_Emp': "",
'UID': uid
});
Navigator.of(context).pop();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Unlock Door Request"),
),
body: new FutureBuilder<DocumentSnapshot>(
future: Firestore.instance.collection('Users').document(uid).get(),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.active:
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
case ConnectionState.done:
if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
} else {
print("why give null $name");
return new Container(
padding: EdgeInsets.only(top: 60.0, left: 20.0, right: 20.0),
child: new Form(
key: formKey,
child: new ListView(
children: <Widget>[
Text(
'Requesting Door Unlock:',
style: TextStyle(
fontSize: 20.0,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 15.0),
Text(
"building: $building, Room: $room",
style: TextStyle(
fontSize: 15.0,
fontStyle: FontStyle.italic,
),
),
TextFormField(
maxLength: 200,
onSaved: (value) => comment = value,
decoration: InputDecoration(
labelText: 'Comment (optional)',
labelStyle: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.bold,
color: Colors.black54),
),
),
Container(
height: 50.0,
width: 130.0,
child: RaisedButton(
child: Text(
'Send Request',
style: TextStyle(
fontSize: 15.0,
fontWeight: FontWeight.bold,
),
),
splashColor: Colors.lightGreen,
onPressed: () {
_handlePressed(context);
}),
),
],
),
),
);
}
}
},
),
);
}
void _handlePressed(BuildContext context) {
confirmDialog(context).then((bool value) async {
if (value) {
validateAndSubmit();
}
});
}
}
Future<bool> confirmDialog(BuildContext context) {
return showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return new AlertDialog(
title: new Text("Send Request"),
actions: <Widget>[
new FlatButton(
child: Text("Yes"),
onPressed: () => Navigator.of(context).pop(true),
),
new FlatButton(
child: Text("No"),
onPressed: () => Navigator.of(context).pop(false),
),
],
);
});
}
【问题讨论】:
-
你找到解决办法了吗?
标签: firebase flutter google-cloud-firestore