Dart空安全下Stream的map方法传参类型不匹配报错怎么解决?
错误原因
_auth.authStateChanges() 方法返回的流类型是 Stream<User?>,即流发出的元素本身就是可空的用户对象(用户未登录时会发射null)。你定义的转换函数_userFromFirebaseUser入参要求为非空的User类型,和map方法要求的入参类型不匹配,所以触发类型校验报错。
另外你当前转换函数内部的if(user != null)判断是无效冗余代码,因为参数声明为非空User时,编译器会默认保证入参不可能为null。
修复方案
方案1:直接修改转换函数的入参类型为可空
这是最简洁的方案,直接对齐流的输入类型即可:
// 把参数类型从User改为User? Users? _userFromFirebaseUser(User? user){ if (user != null){ return Users(uid: user.uid); } return null; } Stream<Users?> get user { return _auth.authStateChanges().map(_userFromFirebaseUser); }
方案2:不修改原有转换函数,在map层做判空适配
如果你的_userFromFirebaseUser函数在其他地方被引用不能修改参数类型,可以在map调用时加一层适配逻辑:
Users? _userFromFirebaseUser(User user){ return Users(uid: user.uid); } Stream<Users?> get user { return _auth.authStateChanges().map((User? user) { // 先判断流返回的用户是否非空,非空才调用转换函数,否则直接返回null return user == null ? null : _userFromFirebaseUser(user); }); }
内容的提问来源于stack exchange,提问作者Something You
相关产品推荐
相关产品推荐

