Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase FlatterFire如何使用onAuthStateChanges?_Firebase_Flutter_Firebase Authentication_Flutter Web - Fatal编程技术网

Firebase FlatterFire如何使用onAuthStateChanges?

Firebase FlatterFire如何使用onAuthStateChanges?,firebase,flutter,firebase-authentication,flutter-web,Firebase,Flutter,Firebase Authentication,Flutter Web,我想知道如何正确地使用FlatterWeb中的onAuthStateChanges my的流程应如下所示: Future<void> main() async { setupLocator(); WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); var authService = locator<AuthenticationService>(); v

我想知道如何正确地使用FlatterWeb中的onAuthStateChanges

my的流程应如下所示:

Future<void> main() async {
  setupLocator();

  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  var authService = locator<AuthenticationService>();
  var navigationService = locator<NavigationService>();

  authService.listenToAuthChanges(
      () => {navigationService.pushNamedAndRemoveUntil(Routes.login)},
      () => {navigationService.pushNamedAndRemoveUntil(Routes.homePage)});

  runApp(MyApp());
}
如果用户已登录,则:

  • 如果该页面是登录页面,则应重定向至主页
  • 如果该页面是除登录页面以外的任何其他页面,则应保留在该页面上
如果用户未登录,则:

  • 如果该页面是登录页面,则应保留在该页面上
  • 如果页面不是登录页面,则应在登录页面上重定向:
我已经创建了身份验证服务,并添加了如下功能:

void listenToAuthChanges(Function onNotLoggedIn, Function onLoggedIn) {
    FirebaseAuth.instance.authStateChanges().listen((firebaseUser) {
      if (firebaseUser == null){
        onNotLoggedIn();
      }else{
        onLoggedIn();
      }
然后在main.dart文件中的main()函数中,我添加了以下内容:

Future<void> main() async {
  setupLocator();

  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  var authService = locator<AuthenticationService>();
  var navigationService = locator<NavigationService>();

  authService.listenToAuthChanges(
      () => {navigationService.pushNamedAndRemoveUntil(Routes.login)},
      () => {navigationService.pushNamedAndRemoveUntil(Routes.homePage)});

  runApp(MyApp());
}
Future main()异步{
setupLocator();
WidgetsFlutterBinding.ensureInitialized();
等待Firebase.initializeApp();
var authService=locator();
var navigationService=locator();
authService.listenToAuthChanges(
()=>{navigationService.pushName和RemoveUntil(Routes.login)},
()=>{navigationService.pushName和removeUntil(Routes.homePage)});
runApp(MyApp());
}
如果我登录并登录到登录页面,这个实现就可以工作,但是无论我在哪个页面上,它都会将我重定向到主页(对于我实现的第二个功能)

我的目标是,只有当我没有登录并且在登录页面上时,才能重定向到主页

因此,我更改了实现,删除了这个函数,并将其添加到我的登录页面的initialize函数中(我使用的是与提供者体系结构堆叠在一起的包),这样,只有当我在登录页面上时才会调用它

以下是我的实施:

Future<void> main() async {
      setupLocator();
    
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
    
      var authService = locator<AuthenticationService>();
      var navigationService = locator<NavigationService>();
    
      authService.listenToAuthChanges(
          () => {navigationService.pushNamedAndRemoveUntil(Routes.login)},
          () => {);
    
      runApp(MyApp());
    }
Future main()异步{
setupLocator();
WidgetsFlutterBinding.ensureInitialized();
等待Firebase.initializeApp();
var authService=locator();
var navigationService=locator();
authService.listenToAuthChanges(
()=>{navigationService.pushName和RemoveUntil(Routes.login)},
() => {);
runApp(MyApp());
}
在我的loginviewmodel.dart中,我有一个函数,只有在调用登录页面时才应调用该函数:

 Future<void> initialise() async {
    bool loggedIn = await authenticationService.isUserLoggedIn();
    if (loggedIn) {
      navigationService.pushNamedAndRemoveUntil(Routes.homePage);
    }
  }
Future initialise()异步{
bool loggedIn=wait authenticationService.isUserLoggedIn();
if(loggedIn){
navigationService.PushName和RemoveUntil(Routes.homePage);
}
}
isUserLoggedIn()函数是一个实用函数,如果auth.currentUser不为null,则返回true,否则返回false

这里的问题是这个函数,虽然它在登录页面中,但是它总是被调用,如果我在其他页面上重定向,那么它的行为和以前一样

我的问题有两个:

  • 如何处理Flatter Web中的onAuthStateChanges
  • 当我键入web应用程序的url时,是否总是调用路由页面(在我的情况下是登录页面),无论我调用什么页面
多谢各位