import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
class ProfileSettings extends StatefulWidget {
@override
_ProfileSettingsState createState() => _ProfileSettingsState();
}
class _ProfileSettingsState extends State<ProfileSettings> {
final firestoreInstance = Firestore.instance;
void _setData() async{
var firebaseUser = await FirebaseAuth.instance.currentUser();
firestoreInstance.collection("tryingdata").document(firebaseUser.uid).setData(
{
"name" : "john",
"age" : 20,
"email" : "[email protected]",
"address" : {
"street" : "street 24",
"city" : "new york"
}
}).then((_){
print("success!");
});
}
void _updateData()async{
var firebaseUser = await FirebaseAuth.instance.currentUser();
firestoreInstance
.collection("tryingdata")
.document(firebaseUser.uid)
.updateData({"age": _age.text}).then((_) {
print("success!");
print(_age);
});
}
final _auth = FirebaseAuth.instance;
String userAge;
TextEditingController _age = TextEditingController();
void _retrieveData() async{
var firebaseUser = await FirebaseAuth.instance.currentUser();
firestoreInstance.collection("tryingdata").document(firebaseUser.uid).get().then((value)
=> userAge = value.data["age"]);
print(userAge);
}
@override
Widget build(BuildContext context) {
_retrieveData();
return Scaffold(
appBar: AppBar(
title: Text(
"Profilepage",
style: TextStyle(
fontFamily: "tepeno",
fontWeight: FontWeight.w600,
),
),
actions: <Widget>[
],
),
body: Column(
children: <Widget>[
TextField(
controller: _age,
initialvalue: //here I need help,
textAlign: TextAlign.left,
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'PLEASE ENTER YOUR AGE',
hintStyle: TextStyle(color: Colors.grey),
),
),
RaisedButton(
onPressed: () {
_setData();
},
child: const Text('SetData', style: TextStyle(fontSize: 12)),
),
RaisedButton(
onPressed: () {
_updateData();
},
child: const Text('UpdateData', style: TextStyle(fontSize: 12)),
),
RaisedButton(
onPressed: () {
_retrieveData();
},
child: const Text('RetrieveData', style: TextStyle(fontSize: 12)),
),
]
),
);
}
}
_setData() 和 _updateData() 函数工作正常。我想在 TextField 中显示初始值。当我点击 _RetrieveData() 按钮时,它会打印出值,例如:20 然后我将数据更新为 21,当我再次打印出来时,它仍然是 20。有时它也会打印出空值。我也在小部件构建中运行 _RetrieveData() 。所以我需要从 firestore 获取数据并将其设置为 TextField 中的初始值,然后我可以更新它。我该如何解决这个问题?我是 Flutter 的新手。谢谢!
我得到了一些帮助,这是解决方案:
Future<dynamic>_retrieveData() async{
var firebaseUser = await FirebaseAuth.instance.currentUser();
await Firestore.instance.collection("tryingdata").document(firebaseUser.uid).snapshots().listen((DocumentSnapshot doc) async{
Map<String, dynamic> document =doc.data;
setState((){
userAge=document['age'];
});
});
}
@override
void initState() {
// TODO: implement initState
super.initState();
_retrieveData();
}
您可以在小部件中使用条件,如下所示:
Container(child: value==null?Text('20'):Text(value))
将此代码添加到 initState 方法
@override
void initState() {
// TODO: implement initState
super.initState();
_retrieveData();
}
完整代码将是:
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
class ProfileSettings extends StatefulWidget {
@override
_ProfileSettingsState createState() => _ProfileSettingsState();
}
class _ProfileSettingsState extends State<ProfileSettings> {
final firestoreInstance = Firestore.instance;
void _setData() async{
var firebaseUser = await FirebaseAuth.instance.currentUser();
firestoreInstance.collection("tryingdata").document(firebaseUser.uid).setData(
{
"name" : "john",
"age" : 20,
"email" : "[email protected]",
"address" : {
"street" : "street 24",
"city" : "new york"
}
}).then((_){
print("success!");
});
}
void _updateData()async{
var firebaseUser = await FirebaseAuth.instance.currentUser();
firestoreInstance
.collection("tryingdata")
.document(firebaseUser.uid)
.updateData({"age": _age.text}).then((_) {
print("success!");
print(_age);
});
}
final _auth = FirebaseAuth.instance;
String userAge;
TextEditingController _age = TextEditingController();
void _retrieveData() async{
var firebaseUser = await FirebaseAuth.instance.currentUser();
firestoreInstance.collection("tryingdata").document(firebaseUser.uid).get().then((value)
=> userAge = value.data["age"]);
print(userAge);
}
@override
void initState() {
// TODO: implement initState
super.initState();
_retrieveData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
"Profilepage",
style: TextStyle(
fontFamily: "tepeno",
fontWeight: FontWeight.w600,
),
),
actions: <Widget>[
],
),
body: Column(
children: <Widget>[
TextField(
controller: _age,
initialvalue: //here I need help,
textAlign: TextAlign.left,
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'PLEASE ENTER YOUR AGE',
hintStyle: TextStyle(color: Colors.grey),
),
),
RaisedButton(
onPressed: () {
_setData();
},
child: const Text('SetData', style: TextStyle(fontSize: 12)),
),
RaisedButton(
onPressed: () {
_updateData();
},
child: const Text('UpdateData', style: TextStyle(fontSize: 12)),
),
RaisedButton(
onPressed: () {
_retrieveData();
},
child: const Text('RetrieveData', style: TextStyle(fontSize: 12)),
),
]
),
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句