如何将 Firestore 中的数据设置为 Flutter 中 TextField 的初始值?

蓝芽
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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 Flutter 中动态更改初始值

如何将地图列表作为初始值传递给 flutter_form_builder 包中的 FormBuilderFilterChip?

如何在flutter的下拉菜单中设置初始值?

在StreamBuilder中具有初始值的TextField

如何为vuex中的数据设置初始值?

在flutter中为下拉按钮选择初始值

如何修复 Flutter Dropdown 中的“只能在初始值设定项中访问静态成员”

Flutter - 如何使用 FutureBuilder 的动态值提供 TextField 的初始值?

如何在Flutter中获取TextField值

如何从 Flutter 中的状态更改 TextField 值?

使用 TextEditingController 设置初始值后,颤动编辑 TextField 中的值

如何为迁移中的主键设置初始值?

如何在react中设置初始值?

如何在 nativescript 中设置 radautocomplete 的初始值?

如何在指令属性中设置初始值

如何在CreateView中动态设置ForeignKey的初始值?

如何在选择控件中设置初始值?

如何在 Django UsercreationForm 中设置初始值

如何在续集模型中设置初始值?

如何从cloud_firestore获取数据并在flutter中将其显示在TextField中

将初始值设置为HTML中Angular Material中的窗体的Toggle

如何将扫描的初始值设置为列表?

Flutter 从 TextField 中检索值

将初始值设置为直接在HTML中可用的vue.js模型

在Antd 4中将初始值设置为动态形式

如何在Jhipster JDL中为实体属性设置初始值?

如何在AngularJS中为select元素设置初始值?

如何在Spring JPA for MySQL中为@Id @GeneratedValue设置初始值?

如何在SQL中为auto_increment设置初始值