使用 StreamProvder 获取用户身份验证更改

时间:2021-03-05 12:13:22

标签: firebase flutter dart

我使用 Wrapper 类结合 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.
}

验证成功后,我可以从 userId 打印正确的 Wrapper Class。但我得到的不是第二张图片,而是第一张。一旦我重新启动我的应用程序,我就会被重定向到主页。

image1

image2

1 个答案:

答案 0 :(得分:0)

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