首页 > 解决方案 > 参数类型“我的用户?Function(User)' 不能分配给参数类型'MyUser Function(User?)'。Flutter Firebase 应用程序构建问题

问题描述

关于 Flutter Firebase 应用构建。流函数有一条红线。目前使用 2 个文件 auth.dart 和 user.dart

我的代码 auth.dart 文件:

import 'package:coffee_dan/models/user.dart';
import 'package:firebase_auth/firebase_auth.dart';

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  MyUser Function(User? event)? get userFromFirebaseUser => null;

  MyUser? _userFromFirebaseUser(User user) {
    // ignore: unnecessary_null_comparison
    return user!= null ? MyUser(uid: user.uid) : null;
  }

  Stream<MyUser> get user {
    return _auth.authStateChanges().map(_userFromFirebaseUser);  Red Line in here **_userFromFirebaseUser**
  }

  Future signInAnon() async {
    try {
      UserCredential result = await _auth.signInAnonymously();
      User? user = result.user;
      return _userFromFirebaseUser(user!);
    } catch (e) {
      print(e.toString());
      return null;
    }
  }
}

user.dart 文件:

class MyUser {
  final String uid;
  MyUser({required this.uid});
}

此处为初始代码此处 更新代码

标签: firebaseflutter

解决方案


您的代码中有两点需要更改:

  1. 您的 _userFromFirebaseUser 签名需要接收一个可为空的用户,然后您就可以删除您的“忽略”注释行。它应该如下所示:

    MyUser? _userFromFirebaseUser(User? user) {
      return user != null ? MyUser(uid: user.uid) : null;
    }
    
  2. 您的用户 getter 应该返回 Stream<MyUser?> ,这将消除错误。那应该如下所示:

    Stream<MyUser?> get user {
      return _auth.authStateChanges().map(_userFromFirebaseUser);
    }
    

完整代码(保留您的导入):

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  MyUser Function(User? event)? get userFromFirebaseUser => null;

  MyUser? _userFromFirebaseUser(User? user) {
    return user!= null ? MyUser(uid: user.uid) : null;
  }

  Stream<MyUser?> get user {
    return _auth.authStateChanges().map(_userFromFirebaseUser);
  }

  Future signInAnon() async {
    try {
      UserCredential result = await _auth.signInAnonymously();
      User? user = result.user;
      return _userFromFirebaseUser(user!);
    } catch (e) {
      print(e.toString());
      return null;
    }
  }
}

推荐阅读