firebase 无法将参数类型“Object?”分配给参数类型“User”

szqfcxe2  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(192)

我尝试使用firebase auth和firestore管理用户角色,但当我尝试将snapshot.data传递给我创建的类以在firestore中保存用户日期时,我收到了此错误。我遵循了教程,但我的代码不同,我正在使用更新的版本。

class Start extends StatelessWidget {
  const Start({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
          stream: FirebaseAuth.instance.authStateChanges(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return const Center(child: CircularProgressIndicator());
            } else if (snapshot.hasData && snapshot.data!=null) {
              UserHelper.saveUser(snapshot.data);
              return const Home();
            } else if (snapshot.hasError) {
              return const Center(child: Text('Algo ha salido mal!'));
            } else {
              return const LoginScreen();
            }
          }),
    );
  }
}

我创建的类:

class UserHelper {
  static FirebaseFirestore db = FirebaseFirestore.instance;

  static saveUser(User user) async {
    Map<String, dynamic> userData = {
      "name": user.displayName,
      "email": user.email,
      "last_login": user.metadata.lastSignInTime,
      "created_at": user.metadata.creationTime,
      "role": "user",
    };

    final userRef = db.collection('users').doc(user.uid);
    if ((await userRef.get()).exists) {
      await userRef.update({
        "last_login": user.metadata.lastSignInTime,
      });
    } else {
      await userRef.set(userData);
    }
  }
}
6psbrbz9

6psbrbz91#

您的方法:

static saveUser(User user) async {
    Map<String, dynamic> userData = {
      "name": user.displayName,
      "email": user.email,
      "last_login": user.metadata.lastSignInTime,
      "created_at": user.metadata.creationTime,
      "role": "user",
    };

接受一个User,但是你传递给它的是snapshot.data

UserHelper.saveUser(snapshot.data);

这绝对不是User
您可能需要在User类上使用fromJson方法,将JSON转换为User

class User {
  String id;
  String name;
  User({required this.id, required this.name});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
    );
  }
}

然后你会称之为:

UserHelper.saveUser(User.fromJson(snapshot.data()!));
8fq7wneg

8fq7wneg2#

您将获得可为空的用户类型Stream<User?> authStateChanges()的流
您应该使用!运算符放弃为空性:UserHelper.saveUser(snapshot.data!),这样做是安全的,因为您在if子句中有snapshot.data!=null检查
顺便说一句,您可能需要重新考虑您的业务逻辑。用户配置文件(名称、电子邮件)发生更改时不会触发authStateChanges(),但您需要在下游调用中更新这些内容。发生这些更改时会触发userChanges(),但如果您订阅了该流,则无需始终更新last_login。请参见https://firebase.flutter.dev/docs/auth/start/#userchanges

相关问题