#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