如何使用firebase_auth和提供程序检测身份验证更改

时间:2019-12-25 14:39:37

标签: flutter dart firebase-authentication flutter-provider

我的Auth提供程序类中有这个简单的登录方法

  Future login(String email, String password) async {
    try {
      AuthResult result = await _firebaseAuth.signInWithEmailAndPassword(
          email: email, password: password);
      FirebaseUser user = result.user;
      var _tokenServer = await user.getIdToken();
      _token = _tokenServer.token;
      _userId = user.uid;
      notifyListeners();
      print("logged in");
      return user.uid;
    } catch (e) {
      print(e);
    }
  }
}

和这个吸气剂

 bool get isAuth {
    return _token != null;
  }

这是我的主要目的

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider.value(
          value: Auth(),
        ),
      ],
      child: Consumer<Auth>(
        builder: (ctx, auth, _) => MaterialApp(
          title: 'Flutter Demo',
          // theme: ThemeData(
          //   // primarySwatch: Colors.blue,
          // ),
          theme: ThemeData.dark(),
          home: auth.isAuth ? HomeScreen() : LoginScreen(),
        ),
      ),
    );
  }

如果我登录,则可以获取所有数据(令牌,ID等),但页面不会更改,而我将停留在登录页面上。 我在做什么错了?

编辑: 现在,我可以重定向到主屏幕了,但是我需要按返回按钮才能进入主屏幕

1 个答案:

答案 0 :(得分:1)

实际上,您不会将整个应用包装在Consumer中。 home属性将不会刷新以更改主路由。您可以改成这样。

示例:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider.value(
          value: Auth(),
        ),
      ],
      child: MaterialApp(
        title: 'Flutter Demo',
        // theme: ThemeData(
        //   // primarySwatch: Colors.blue,
        // ),
        theme: ThemeData.dark(),
        home: Consumer<Auth>(
          builder: (ctx, auth, _) {
            return auth.isAuth ? HomeScreen() : LoginScreen();
          },
        ),
      ),
    );
  }
}

希望有帮助!