Как проверить, зарегистрирован ли пользователь в приложении или нет

#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();
            }
          },
        )
    );
  }
}