firebase - Flutter/Firebase-提取当前登录的用户数据时出错

标签 firebase flutter dart google-cloud-firestore

我想获取当前登录的用户数据。 fire_store'useremail'中有一个字段。当用户登录时,我得到了他的ID,并使用“where class”根据他的ID提取了动物的数据,如下所示:

  Widget _buildBody(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection('booking_tbl').where("useremail", isEqualTo: _firebaseUser.email.toString()).snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) return LinearProgressIndicator();
        return _buildList(context, snapshot.data.documents);
      },
    );
  }

尽管它可以正常工作,但它也显示错误。我需要一些帮助来解决此问题,或者对此有其他建议(任何建议或其他帮助将不胜感激):

════════ Exception caught by widgets library ══════════════════════

NoSuchMethodError was thrown building UserBookingHistoryModel(dirty, state: _UserBookingHistoryModelState#2d8c2):

The getter 'email' was called on null. Receiver: null

Tried calling: email



可能是此问题是由Firebase Auth中的此片段引起的:
  void initState() {
    super.initState();
      widget.auth.getCurrentUser().then((firebaseUserId) {
      setState(() {
        authStatus = firebaseUserId == null
            ? AuthStatus.notSignedIn
            : AuthStatus.signedIn;
      });
    });
  }

booking.dart的完整代码在这里:
class _UserBookingHistoryModelState extends State<UserBookingHistoryModel> {

  FirebaseAuth _auth;
  FirebaseUser _firebaseUser;

  @override
  void initState() {
    super.initState();
    _auth = FirebaseAuth.instance;
    _getCurrentUser();
  }
  _getCurrentUser () async {
    _firebaseUser = await FirebaseAuth.instance.currentUser();
    setState(() {
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _buildBody(context),
    );
  }

  Widget _buildBody(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection('booking_tbl').where("useremail", isEqualTo: _firebaseUser.email.toString()).snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) return LinearProgressIndicator();
        return _buildList(context, snapshot.data.documents);
      },
    );
  }

  Widget _buildList(BuildContext context, List<DocumentSnapshot> snapshot) {
    return ListView(
      padding: const EdgeInsets.only(top: 5.0),
      children: snapshot.map((data) => _buildListItem(context, data)).toList(),
    );
  }

  Widget _buildListItem(BuildContext context, DocumentSnapshot data) {
    final record = Record.fromSnapshot(data);
    return Padding(
      key: ValueKey(record.animal),
      padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
      child: Container(
          decoration: BoxDecoration(
            border: Border.all(color: Colors.grey),
          ),
          child: new ListTile(
            title: new Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                new Text(
                  "${record.animal} Slaughtering",
                  style: new TextStyle(fontWeight: FontWeight.bold, color: Colors.black),
                ),

              ],
            ),

          )

      ),
    );
  }
}

class Record {
  final String animal;
  final String user;
  final DocumentReference reference;


  Record.fromMap(Map<String, dynamic> map, {this.reference})
      : assert(map['animal'] != null),
        assert(map['user'] != null),
        animal = map['animal'],
        user = map['user'];
  Record.fromSnapshot(DocumentSnapshot snapshot)
      : this.fromMap(snapshot.data, reference: snapshot.reference);

  @override
  String toString() => "Record<$animal:$user>]";
}

最佳答案

您需要执行以下操作:

Stream<QuerySnapshot> getData() async*{
 FirebaseUser firebaseUser = await FirebaseAuth.instance.currentUser();
 yield* Firestore.instance.collection('booking_tbl').where("useremail", isEqualTo: firebaseUser.email.toString()).snapshots();
}

然后在StreamBuilder内部使用getData():
    return StreamBuilder<QuerySnapshot>(
      stream: getData(),
      builder: (context, snapshot) {
        //....
getData()方法是异步的,因为您使用的是StreamBuilder,所以您需要返回一个Stream,因此您使用async*关键字,然后使用yield*发出结果

关于firebase - Flutter/Firebase-提取当前登录的用户数据时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62219165/

相关文章:

flutter - 我的 ElevatedButton 的宽度没有减少

flutter - 固定小部件在一行中的位置

android - 使用 WakefulBroadcastReceiver 的 Firebase 集成

Firebase 查询双重嵌套

java - Android:从子集合中获取字段值

flutter - 检测用户何时停止触摸屏幕

firebase - 火存储 : Query array with greater than operator

flutter - 让用户使用Flutter登录Android设备

dart - 检查一个列表是否包含另一个列表的一个或多个值

android - 获取 flutter 地点ID的地址