首页 > 解决方案 > 使用 StreamProvder 获取用户身份验证更改

问题描述

我正在使用WrapperClass 结合Firebase Streams将用户重定向到LogInPageHomePage

下面是main.dartWrapper类。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamProvider<Users>.value(
      value: AuthenticationService(FirebaseAuth.instance).user,
      child: MaterialApp(
        title: 'Flutter Demo',
        debugShowCheckedModeBanner: false,
        home: Wrapper(),
      ),
    );
  }
}

class Wrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<Users>(context);

    print(user == null ? "null id" : "${user.userId}");

    return user == null
        ? LoginPage()
        : HomePage();
  }
}

下面是我Authentication Class和我调用authentication method.

onTap: () async {
    dynamic user = await _auth.verifySMS(
      widget.verificationId,
      code,
      context,
    );
    if (user == null) {
      showDialog(
      context: context,
      builder: (BuildContext context) {
          return CustomDialogBox(
          title: "Error",
          descriptions: "Can not Login now.",
             text: "Try Again",
             );
          });
       }
},

class AuthenticationService {
  final FirebaseAuth _firebaseAuth;

  AuthenticationService(this._firebaseAuth);

  // Getting user from firebase
  Users _getUserFromFirebase(User user) {
    return user != null
        ? Users(
            userId: user.uid,
          )
        : null;
  }

  // Stream<User> get authStateChanges => _firebaseAuth.idTokenChanges();
  Stream<Users> get user {
    return _firebaseAuth.authStateChanges().map(_getUserFromFirebase);
  }

// authentication methods which returns _getUserFromFirebase.
}

验证成功后,我可以userIdWrapper Class. 但我得到的不是第二张图片。一旦我重新启动我的应用程序,我就会被重定向到主页。

图像1

图2

标签: firebaseflutterdart

解决方案


Firebase Socket 连接不适用于模拟器。不知道为什么。如果您在真实设备上进行测试,您可能会得到预期的结果。


推荐阅读