【问题标题】:firebase flutter - Receive null till reload emulator works finefirebase flutter - 接收 null 直到重新加载模拟器工作正常
【发布时间】:2021-09-27 02:41:54
【问题描述】:

是否有办法避免使用 Streambuilder 或 Futurebuilder 从 firebase 查询数据。我曾尝试使用 Future async 但错误说收到 null 直到我重新加载模拟器之后它工作正常。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';


class infoStudentCard extends StatefulWidget {
  
  infoStudentCard();

  @override
  _infoStudentCardState createState() => _infoStudentCardState();
}

class _infoStudentCardState extends State<infoStudentCard> {

 String userId = (FirebaseAuth.instance.currentUser).uid;
  String _sname;
  String _slastname;
  String _semail;
  String _sid;
  String _sclass;
  Future data;

  @override
 void initState() { 
   super.initState();
   data = getDataFromDb();
 }

 Future<void> getDataFromDb() async{
      FirebaseFirestore.instance
              .collection("student")
              .doc(userId)
              .get()
              .then((DocumentSnapshot documentSnapshot)  {
                    this._sname = documentSnapshot.get('sname');
 
              });
 }
  @override
  Widget build(BuildContext context) {
    return Text(_sname);
  }
}

【问题讨论】:

    标签: firebase flutter dart


    【解决方案1】:

    received null till I reload the emulator after that it works fine.

    每次更改时,请致电setState 以查看结果:

     Future<void> getDataFromDb() async{
          FirebaseFirestore.instance
                  .collection("student")
                  .doc(userId)
                  .get()
                  .then((DocumentSnapshot documentSnapshot)  {
                     setState(() {
                       this._sname = documentSnapshot.get('sname');
                     });
                  });
     }
    

    其他,在 initState 中,您正在调用 data = getDataFromDb,但是您的函数什么也不返回。只需添加:

     @override
     void initState() { 
       super.initState();
       getDataFromDb();
     }
    

    或向您的 data 添加一个值,从函数返回一个值

    
     late Future<DocumentSnapshot> data;
    
     @override
     void initState() { 
       super.initState();
       data = getDataFromDb();
     }
    
    Future<DocumentSnapshot > getDataFromDb() async{
          return FirebaseFirestore.instance
                  .collection("student")
                  .doc(userId)
                  .get()
                  .then((DocumentSnapshot documentSnapshot)  {
                     setState(() {
                       this._sname = documentSnapshot.get('sname');
                     });
                  });
     }
    

    【讨论】:

    • 感谢卢卡斯。我还有几个问题,我们可以检查 documentSnapshot 连接状态吗?
    猜你喜欢
    • 2021-09-26
    • 2020-08-14
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2022-06-11
    相关资源
    最近更新 更多