Установите динамический начальный маршрут в flutter с firebase

#firebase #flutter #dart #firebase-authentication

#firebase #flutter #dart #firebase-аутентификация

Вопрос:

я новичок в разработке flutter и firebase, и у меня есть вопрос: у меня есть 2 маршрута: SignInRoute и HomeRoute, и при запуске приложения пользователь будет перенаправлен на экран в зависимости от текущего пользователя. если CurrentUser != null => перенаправить его на рабочий стол, иначе перенаправить на экран входа. Как я могу добавить эту логику в main.dart. Вот мой код, при запуске он всегда выдает SignInScreen.routeName в качестве начального маршрута:

 import 'package:books_library_app/routes.dart';
import 'package:books_library_app/theme.dart';
import 'package:books_library_app/ui/views/home/home_view.dart';
import 'package:books_library_app/ui/views/auth/sign_in_view.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';


void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  FirebaseUser user;
  
  @override
  void initState() {
    super.initState();
    getCurrentUser();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: theme(),
      initialRoute:
          (user != null) ? HomeView.routeName : SignInScreen.routeName,
      routes: routes,
    );
  }

  getCurrentUser() async {
    FirebaseUser currentUser;
    currentUser = await FirebaseAuth.instance.currentUser();
    setState(() {
      user = currentUser;
    });
  }
}
  

Комментарии:

1. Самым простым способом было бы создать целевую страницу по умолчанию, которая проверяет, авторизован ли пользователь, и впоследствии перенаправляет их на соответствующую страницу.

2. я пробовал это раньше, я создал экран (statefullWidget) с именем Welcome и установил его в качестве начального маршрута, и в этом виджете я вставил свою логику, но проблема заключалась в том, что я не мог перейти к экрану с именованным маршрутом, поскольку на экране приветствия должен возвращаться виджет.

3. «Должен возвращать виджет»? Какая часть вашей логики должна возвращать виджет?

Ответ №1:

проблема может возникнуть из-за того, что пользовательская функция становится асинхронной, поэтому сначала, когда ваша страница приветствия создается, начальное значение user равно null, а когда оно обновляется, виджет уже создан, поэтому один из способов, который вы можете сделать, это создать страницу приветствия в качестве экрана загрузки или любой заставки вашего приложения и в функции getcurrentuser

  getCurrentUser() async {
    FirebaseUser currentUser;
    currentUser = await FirebaseAuth.instance.currentUser();
    if(currentuser==null){
//push to signin page
} 
else{
//push to home page
}
}
  

функция initstate

  void initState() {
    getCurrentUser();
     super.initState();
  }
  

спасибо, я надеюсь, что это поможет, дайте мне знать, если вы все еще сталкиваетесь с какой-либо проблемой

Комментарии:

1. Спасибо, я попробую и расскажу, и у меня есть другие вопросы, где я могу вызвать getCurrentUser на экране загрузки?

2. ваша целевая страница — это экран загрузки, оттуда в initstate вы вызовете эту функцию, и как только эта функция будет завершена, вы перейдете либо на домашнюю страницу, либо на страницу входа. я обновлю ответ с помощью функции initstate