Flutter中Firebase Auth的authStateChanges.map调用编译报错求助
Flutter集成Firebase Auth编译错误修复方案
错误根源拆解
- authStateChanges调用方式错误:
authStateChanges是Firebase Auth提供的方法,不是属性,直接写_auth.authStateChanges拿到的是函数对象(类型为Stream<User?> Function()),自然没有map方法,必须加括号调用获取Stream实例。 - _userfromFirebaseUser方法参数错误:该方法应该接收Firebase的
User?对象,不是自定义的Bro模型,否则无法正确转换用户数据。 - 空判断逻辑错误:方法内写的
User != null是判断类是否为空,完全逻辑错误,应该判断传入的user参数是否为null。 - Stream泛型不匹配:转换后的Stream可能返回null,泛型应该设为
Bro?而非Bro。
修正后的完整auth.dart代码
import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/foundation.dart'; import 'package:lewandowski/models/bro.dart'; class AuthService{ // 初始化Firebase Auth实例 final FirebaseAuth _auth = FirebaseAuth.instance; Bro? get bro => null; // 将Firebase User转换为自定义Bro模型 Bro? _userfromFirebaseUser(User? user){ return user != null ? Bro(uid: user.uid) : null; } // 用户状态变更流 Stream<Bro?> get user { // 注意authStateChanges后面要加()调用方法 return _auth.authStateChanges().map(_userfromFirebaseUser); } // 匿名登录 Future<Bro?> signAnon() async { try { UserCredential result = await _auth.signInAnonymously(); User? user = result.user; // 返回转换后的自定义模型 return _userfromFirebaseUser(user); } catch (e) { print(e.toString()); return null; } } // 退出登录 Future signOut() async{ try{ return await _auth.signOut(); } catch(e){ print(e.toString()); return null; } } // 邮箱密码登录(待实现) // 邮箱密码注册(待实现) }
额外优化建议
- signAnon方法返回值改为
Bro?,统一使用自定义模型,避免上层代码混用Firebase User和自定义Bro。 - 可以给Bro模型添加更多构造方法或转换逻辑,方便后续扩展用户信息。
内容的提问来源于stack exchange,提问作者Robert Balinda
相关产品推荐
相关产品推荐

