微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用 Provider 和获取数据:尝试调用 Provider.of<dynamic>

如何解决无法使用 Provider 和获取数据:尝试调用 Provider.of<dynamic>

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

图片中的错误信息:

enter image description here

getter 位于问题出处的下方:

    _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'];
    });
  }]

使用来自 Provider 的数据在 Future 构建器下方。

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,};
}
}

enter image description here

解决方法

await Provider.of(context,listen: false) //<--- here is your problem,you don't define the type of Provider
   .collection('Users')
   .document(uid)
   .get().then((result) {
     user.isAdmin = result.data['isAdmin'];
});

改成这样

await Provider.of<FirebaseFirestore>(context,listen: false)...the rest of your code...
,

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。