firebase - null an 在 Flutter 中显示,但在 Future 中具有正确的值
问题描述
我是 Flutter 的新手,我无法解决这个问题。我有一个非常简单的应用程序。它只是用谷歌登录,在 Firebase 中创建了一个用户,该用户有一个计数器和一个按钮,这个按钮增加了计数器(int _user.count++)。
然后是我的问题:在下一个窗口中登录后,直到我单击“加号”按钮才能看到计数变量。变量是正确的,并且使用 fireStore 的查询工作得很好我得到了变量,但是如果我不点击按钮,我得到一个显示在变量“null”的位置。
非常感谢您的帮助和时间,我真的希望您能帮助我。也许这是一个小问题,我还没有找到有关它的信息,但是当一些人开始学习时就会发生这种情况。
MyDAO: Hier the Method Future 它负责对 FireStore 进行查询。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:gauth/user_model.dart';
import 'package:rxdart/rxdart.dart';
final UserDAO userDAO = UserDAO();
class UserDAO {
final Firestore _db = Firestore.instance;
PublishSubject loading;
Observable<Future<QuerySnapshot>> profile;
void updateData(UserModel user) async {
DocumentReference documentReference =
_db.collection("users").document(user.uid);
return documentReference.setData({
"uid": user.uid,
"userName": user.name,
"email": user.email,
"photoUrl": user.photoUrl,
"count": user.count,
"lastIn": DateTime.now()
}, merge: true);
}
Future<QuerySnapshot> readDateFutur(String email) async {
// loading.add(true);
QuerySnapshot querySnapshot = await (_db
.collection("users")
.where("email", isEqualTo: email)
.getDocuments());
// loading.add(false);
return querySnapshot;
}
}
在方法“void initState()”中,我持有变量_user.couner,它有效。
class PlusCounter extends StatefulWidget {
UserModel user;
PlusCounter(this.user);
@override
_PlusCounterState createState() => _PlusCounterState();
}
class _PlusCounterState extends State<PlusCounter> {
UserModel _user;
PublishSubject loading;
@override
void initState() {
// TODO: implement initState
super.initState();
setState(() {
_user = widget.user;
//loading.add(false);
userDAO.readDateFutur(_user.email).then((QuerySnapshot docs) {
if (docs.documents.isNotEmpty) {
print("::::::::::NOESTOY VACIO:::::::::::::::::::::");
print(docs.documents.last.data["count"]);
if (docs.documents.last.data["count"] != null) {
_user.count = docs.documents.last.data["count"];
} else {
_user.count = 0;
}
} else {
print(":::::::::::ESTOY VACIO:::::::::::::::::");
_user.count = 0;
}
});
});
}
void _plus() {
setState(() {
_user.count++;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Text("Cuantas veces te has \n lavado las manos:"),
Text("${_user.count}"),
MaterialButton(
onPressed: () {
_plus();
},
child: Text("Plus"),
textColor: Colors.white,
color: Colors.blue,
),
MaterialButton(
onPressed: () => userDAO.updateData(_user),
child: Text("Guardar"),
textColor: Colors.white,
color: Colors.blue,
),
],
);
}
}
WelcomePage 代码就是这个。
class userDataWelcome extends StatelessWidget {
UserModel _userModel;
userDataWelcome(this._userModel);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Welcome"),
),
body: Center(
child: Column(
children: <Widget>[
Center(
child: Container(
height: 100.0,
width: 100.0,
decoration: BoxDecoration(
shape: BoxShape.circle,
image: DecorationImage(
image: NetworkImage(_userModel.photoUrl),
),
),
),
),
Text("${_userModel.name}"),
PlusCounter(_userModel),
MaterialButton(
onPressed: () => authService.SingOut(),
child: Text("Logout"),
textColor: Colors.white,
color: Colors.deepOrange,
)
],
),
),
);
}
}
然后我真的不知道为什么我需要单击“加号”按钮才能看到 _user.count 的值,因为否则我只会看到 null。再次,我想说谢谢你的帮助。
解决方案
initStat()
_user.count = docs.documents.last.data["count"];
尝试像setState((){});
这样包装这一行
setState((){
_user.count = docs.documents.last.data["count"];
)};
推荐阅读
- python - 双索引后更改数组元素
- javascript - 相同的链接会在位置历史记录中创建重复项
- javascript - 如何在引导程序 4 中响应设置高度
- javascript - 导入后导出的模块未定义
- go - Go 中的缓冲通道
- python - 在没有熊猫的情况下将csv转换为Json(python)
- flow-project - 基于多智能体的Get_state()函数问题
- c# - Dbfactories.getfactory 方法在服务器 .net 上部署时无法建立连接
- r - 使用 lapply 根据条件对列表进行子集化以创建新列表并保留元素的名称
- node.js - 会话在 Express 中混合