Flutter Firebase构建报错:参数类型MyUser? Function(User)无法赋值给MyUser Function(User?)
问题原因分析
这个报错是函数类型不匹配导致的,核心原因有两点:
- Firebase的
authStateChanges()方法返回的是Stream<User?>类型,发射的事件值可能是已登录的User实例,也可能是未登录状态的null,所以map方法要求传入的转换函数必须支持接收User?类型的入参 - 你当前定义的
_userFromFirebaseUser函数入参是不可空的User类型,返回值是可空的MyUser?,和map要求的MyUser Function(User?)类型完全不匹配,因此触发编译报错
解决方案
只需调整auth.dart文件中转换函数的入参类型和Stream的泛型声明即可,修改后的完整代码如下:
import 'package:coffee_dan/models/user.dart'; import 'package:firebase_auth/firebase_auth.dart'; class AuthService { final FirebaseAuth _auth = FirebaseAuth.instance; // 无用的冗余getter可以直接删除 // MyUser Function(User? event)? get userFromFirebaseUser => null; // 调整入参为可空类型User? MyUser? _userFromFirebaseUser(User? user) { return user!= null ? MyUser(uid: user.uid) : null; } // 调整Stream泛型为可空类型MyUser?,匹配转换函数的返回值 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; } } }
user.dart文件无需做任何修改。
如果你不想让Stream返回可空类型,也可以在转换函数中给未登录状态设置默认的MyUser实例,示例如下:
MyUser _userFromFirebaseUser(User? user) { return user!= null ? MyUser(uid: user.uid) : MyUser(uid: ''); } // 对应Stream泛型保持MyUser即可 Stream<MyUser> get user { return _auth.authStateChanges().map(_userFromFirebaseUser); }
更推荐返回可空类型的方案,可以更清晰的区分登录/未登录状态。
内容的提问来源于stack exchange,提问作者Mike Osborn
相关产品推荐
相关产品推荐

