Я делаю приложение во флаттере и работаю над аутентификацией. Я хочу знать, как я могу сохранить пользователя в системе после перезагрузки приложения. Теперь дело в том, что у моего приложения есть 2 типа пользователей (Клиент и Драйвер). Таким образом, у каждого есть свое пространство, например, вход и регистрация и основное (после входа в систему). Это код, который я использовал для регистрации.
class Initializer extends StatefulWidget {
// Access to this Screen
static String id = 'initializer';
@override
_InitializerState createState() => _InitializerState();
}
class _InitializerState extends State<Initializer> {
// Firebase Stuff
final _auth = FirebaseAuth.instance;
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
User _user;
// To Check if There's a Driver
bool isDriver = true;
void getCurrentUser() async {
try {
final getCurrentUser = _auth.currentUser;
if (getCurrentUser != null) {
getUserKind();
_user = getCurrentUser;
}
} catch (e) {
print(e);
}
}
getUserKind() async {
try {
// To fetch Database for Driver
final QuerySnapshot checkOfDriver =
await _firestore.collection('driver').where('uid', isEqualTo: _user.uid).get().catchError((error) {
print(error);
});
if (checkOfDriver.docs.isEmpty)
setState(() {
isDriver = false;
});
else
setState(() {
isDriver = true;
});
} catch (e) {
print(e);
return null;
}
}
@override
void setState(fn) {
if (mounted) {
super.setState(fn);
}
}
@override
void initState() {
super.initState();
getCurrentUser();
}
@override
Widget build(BuildContext context) {
getCurrentUser();
SizeConfig().init(context);
return _user == null
? WelcomeScreen()
: isDriver
? DriverMain()
: ClientMain();
}
}
На самом деле это работает, но неправильно, потому что, когда я перезагружаю приложение, когда я вхожу в систему как клиент, приложение показывает мне DriverMain в начале в течение одной секунды, а затем переключается на правую сторону, которая является ClientMain, и это вызывает иногда бывают ошибки, и в любом случае это неэффективная работа.
Итак, что мне добавить в код или ...
Спасибо, но это не проблема. Пожалуйста, прочтите мое объяснение проблемы.
С чего ты взял, что проблема не в этом? Вы уже запускали код в отладчике? Если вы установите точку останова на
getCurrentUser()
внутри методаbuild
, я предполагаю, что вы увидите, что он возвращаетnull
. Я также ожидал бы, чтоisDriver
будет иметь значение по умолчанию в этот момент, независимо от того, какое значение из базы данных. Причина этого в том, что вы не обрабатываете асинхронный характер восстановления учетной записи пользователя и чтения из Firestore, аStreamBuilder
иFutureBuilder
являются самым простым решением для этого.