首页 > 解决方案 > 无法使用提供者和获取数据:尝试调用 Provider.of

问题描述

我无法通过 Provider 从 firestore/firebase 检索布尔值。

图片中的错误信息: 在此处输入图像描述

吸气剂低于问题的来源:

    _getProfileData(AuthNotifier authNotifier) async {
      final uid = await Provider.of<AuthNotifier>(context, listen: false).getCurrentUID();
    await Provider.of(context, listen: false)
        .collection('Users')
        .document(uid)
        .get().then((result) {
          user.isAdmin = result.data['isAdmin'];
    });
  }]

在 Future builder 下方,使用来自 Provider 的数据。

future: _getProfileData(authNotifier),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              _isAdmin = snapshot.data['isAdmin'] ?? false;
            }
            return Container(
              child: Column(
                children: <Widget>[
                  adminFeature(),
                  ]

下面,我有身份验证通知程序来从 firebase 检索数据。

  Future<String> getCurrentUID() async {
    return (await _firebaseAuth.currentUser()).uid;
  }

  // GET CURRENT USER
  Future getCurrentUser() async {
    return await _firebaseAuth.currentUser();
  }
class User {
  List favorites = [];  
  String documentID;
  String displayName;
  String email;
  String password;
  bool isAdmin;

  User({
    this.favorites,
    this.documentID,
    this.displayName, 
    this.email,
    this.password,
    this.isAdmin,

    });

  factory User.fromFirestore(DocumentSnapshot document) {
    Map data = document.data;

    return User(
      favorites: data['favorite'] ?? [],
      documentID: document.documentID,
      displayName: data['displayName'] ?? '',
      email: data['email'] ?? '',
      isAdmin: data['isAdmin'] ?? false,
    );
  }

  // get admin => null;
    Map<String, dynamic> toMap() {
    return {
      'displayName': displayName,
      'email': email,
      'isAdmin': isAdmin,
    };
}
}

在此处输入图像描述

标签: firebasefluttergoogle-cloud-firestoreprovider

解决方案


我相信您需要使用 T 的用户,而不仅仅是用户:

return User<T>( // <--- Here
      favorites: data['favorite'] ?? [],
      documentID: document.documentID,
      displayName: data['displayName'] ?? '',
      email: data['email'] ?? '',
      isAdmin: data['isAdmin'] ?? false,
);

推荐阅读