【问题标题】:type '_BroadcastStream<User>' is not a subtype of type 'Stream<FirebaseUser>?'类型“_BroadcastStream<User>”不是“Stream<FirebaseUser>?”类型的子类型
【发布时间】:2021-04-13 18:31:54
【问题描述】:

我正在尝试检查用户是否通过 firebase 登录,这将确定显示的屏幕路径。自从更新到 0.5.0 版后,我遇到了上述错误。

我正在通过以下小部件检查日志记录状态

Widget _getScreenId() {
    return StreamBuilder<FirebaseUser>(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (BuildContext context, snapshot) {
        if (snapshot.hasData) {
          Provider.of<UserData>(context).currentUserId = snapshot.data.uid;
          return HomeScreen();
        } else {
          return LoginScreen();
        }
      },
    );
  }

然后用下面的方法初始化firebase

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

【问题讨论】:

    标签: firebase flutter firebase-authentication stream


    【解决方案1】:

    您收到此错误是因为

    Provider.of<UserData>(context).currentUserId = snapshot.data.uid;
    

    尝试下一步:

        return StreamBuilder<UserData>(
              stream: auth.onAuthStateChanged,
              builder: (_, AsyncSnapshot<UserData> snapshot) {
                if (snapshot.connectionState == ConnectionState.active) {
                  final UserData user = snapshot.data;
                  if (user == null){
                    return LoginScreen()
                  }
    
                  return Provider.value(
                    value: snapshot.data,
                    child: HomeScreen(),
                  );
                } else {
                  return Scaffold(
                    body: Center(
                      child: CircularProgressIndicator(),
                    ),
                  );
                }
              },
            );
    

    但是,您将需要执行我实际上建议您执行的额外步骤,实施和 authservice 以将 FirebaseUser 映射到您的 UserData。

    class FirebaseAuthService implements AuthService {
      final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
    
      UserSystem _userFromFirebase(User user) {
        if (user == null) {
          return null;
        }
    
        return UserData(
            uid: user.uid,
            email: user.email,
            displayName: user.displayName,
            photoUrl: user.photoURL,
            isVerified: user.emailVerified);
      }
    
      @override
      Stream<UserData> get onAuthStateChanged {
        return _firebaseAuth.onAuthStateChanged.map(_userFromFirebase);
      }
    }
    

    当然,这是可选的,添加一个抽象类,您可以在其中管理和定义所有方法。 Facebook、谷歌、EmailAndPassword。

    abstract class AuthService {
      Future<UserData> currentUserSystem();
      Future<UserData> signInAnonymously();
      Future<UserData> signInWithEmailAndPassword(String email, String password);
      Future<UserData> signInWithGoogle();
      Future<UserData> signInWithFacebook();
      Future<void> signOut();
      Stream<UserData> get onAuthStateChanged;
      void dispose();
    }
    

    如果这有帮助,请告诉我!

    【讨论】:

      猜你喜欢
      • 2019-10-24
      • 2020-07-02
      • 2021-07-28
      • 2020-08-23
      • 2021-09-04
      • 2020-09-01
      • 1970-01-01
      • 2021-09-18
      • 2020-11-28
      相关资源
      最近更新 更多