#flutter #authentication #dart #firebase-authentication #flutter-futurebuilder
# #flutter #аутентификация #dart #firebase-аутентификация #flutter-futurebuilder
Вопрос:
В 2019 году мне удалось проверить, зарегистрирован ли пользователь в приложении или нет. К сожалению, с тех пор многое изменилось. Я пробовал искать учебные пособия и руководства по FlutterFire. Но я не смог найти ни одного. Я так смущен stream
, future
, и provider
. Я также не знаю разницы между ними.
Мой старый код (больше не работает):
Future main() async {
runApp(
ChangeNotifierProvider<AuthService>(
child: MyApp(),
create: (BuildContext context) {
return AuthService();
},
),
);
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitUp]);
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'TestApp',
theme: ThemeData(primarySwatch: Colors.blue),
home: FutureBuilder<FirebaseUser>(
future: Provider.of<AuthService>(context).getUser(),
builder: (context, AsyncSnapshot<FirebaseUser> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
// log error to console
if (snapshot.error != null) {
print("error");
return Text(snapshot.error.toString());
}
// redirect to the proper page
return snapshot.hasData ? HomePage() : LoginPage();
} else {
// show loading indicator
return LoadingCircle();
}
},
),
);
}
}
class AuthService with ChangeNotifier {
final FirebaseAuth _auth = FirebaseAuth.instance;
Future<FirebaseUser> getUser() {
return _auth.currentUser();
}
Future logout() async {
var result = FirebaseAuth.instance.signOut();
notifyListeners();
return resu<
}
Future<FirebaseUser> loginUser({String email, String password}) async {
try {
var result = await FirebaseAuth.instance
.signInWithEmailAndPassword(email: email, password: password);
notifyListeners();
return result.user;
} catch (e) {
throw new AuthException(e.code, e.message);
}
}
}
Как мне проверить, зарегистрирован ли пользователь или нет? Заранее благодарим вас за помощь.
Комментарии:
1. Вы проверили документацию? firebase.flutter.dev/docs/auth/usage
2. Я сделал. Но я все еще не понимаю. В чем разница между authStateChanges, idTokenChanges и userChanges?
Ответ №1:
Создайте глобальный экземпляр пользователя firebase и на своем первом экране, например, на заставке, проверьте, является ли текущий пользователь null или нет, затем, в зависимости от результата, перейдите к экрану по вашему выбору. Вот мой код, вы можете немного изменить его и попробовать.
Future<void> tryAutoLogin() async {
firebaseUser = firebaseAuth.currentUser;
if (firebaseUser == null) return;
Response<AppUser> userDataResponse =
await DatabaseInterface.getUserData(firebaseUser?.uid);
if (userDataResponse.success) {
appUser = userDataResponse.data;
await appUser?.cacheAppUserData();
} else
return;
}
Ответ №2:
Это работает для FlutterFire!
Firebase Auth позволяет вам подписаться в режиме реального времени на это состояние через
Stream
. После вызоваstream
он предоставляет немедленное событие текущего состояния аутентификации пользователя, а затем предоставляет последующие события при изменении состояния аутентификации. Чтобы подписаться на эти изменения, вызовитеauthStateChanges()
метод в вашем экземпляре FirebaseAuth:
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:flutter/material.dart';
import 'menu.dart';
import 'login.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:firebase_core/firebase_core.dart';
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
MyApp()
);
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitUp]);
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'TestApp',
theme: ThemeData(primarySwatch: Colors.blue),
home:
StreamBuilder<auth.User>(
stream: auth.FirebaseAuth.instance.authStateChanges(),
builder: (BuildContext context, AsyncSnapshot<auth.User> snapshot) {
if(snapshot.hasData) {
print("data exists");
return HomePage();
}
else {
return LoginPage();
}
},
)
);
}
}