аутентификация Firebase с помощью Provider flutter - PullRequest
1 голос
/ 29 мая 2020

Я попытался реализовать эту аутентификацию здесь Firebase с Porvider здесь проблема в том, что я хочу сохранить состояние переменной loggedIn, даже если я закрываю и восстанавливаю приложение, поэтому я использовал этот код, но не работал

    class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<AuthenticationService>(builder: (_, auth, __) {
      if (auth.getCurrentUser() != null)
        return HomeView();
      else
        return TermsView();
    });
  }
}

здесь метод получения текущего пользователя

Future getCurrentUser() async {
FirebaseUser _user ;
_user = await FirebaseAuth.instance.currentUser();

return _user ;
}

Есть ли способ проверить вход внутри Consumer?

Ответы [ 2 ]

1 голос
/ 03 июня 2020

Вам нужно использовать FirebaseAuth.currentUser, чтобы проверить, вошел ли пользователь в систему или нет, я использую FutureBuilder внутри Consumer для этой работы.

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(
    ChangeNotifierProvider<Auth>(
      create: (_) => Auth(),
      child: MaterialApp(home: MyApp()),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<Auth>(
      builder: (_, auth, __) {
        return FutureBuilder<FirebaseUser>(
          future: auth.currentUser,
          builder: (context, snapshot) {
            if (snapshot.hasData) return HomeScreen();
            return LoginScreen();
          },
        );
      },
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color(0xFF4C3E13),
      appBar: AppBar(title: Text('Home Screen')),
      floatingActionButton: FloatingActionButton.extended(
        label: Text('Sign out'),
        onPressed: () async {
          final auth = Provider.of<Auth>(context, listen: false);
          await auth.signOut();
        },
      ),
    );
  }
}

class LoginScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Login Screen')),
      body: Center(
        child: RaisedButton(
          onPressed: () async {
            final auth = Provider.of<Auth>(context, listen: false);
            await auth.signIn(email: 'user@user.com', password: 'user1234');
          },
          child: Text('Sign In'),
        ),
      ),
    );
  }
}

class Auth with ChangeNotifier {
  final _auth = FirebaseAuth.instance;

  Future<void> signOut() async {
    await _auth.signOut();
    notifyListeners();
  }

  Future<void> signIn({@required String email, @required String password}) async {
    await _auth.signInWithEmailAndPassword(email: email, password: password);
    notifyListeners();
  }

  Future<FirebaseUser> get currentUser async {
    return await _auth.currentUser();
  }
}
0 голосов
/ 29 мая 2020

Принимая код CopsOnRoad,

class Auth with ChangeNotifier {
  bool _loggedIn = false;

  bool get loggedIn => _loggedIn;

  // other code
}

Как видите, он уже реализовал часть loggedIn, поэтому все, что вам нужно сделать, это

return Consumer<Auth>(
  builder: (_, auth, __) {
    if (auth.loggedIn)
      return HomeView();
    else
      return TermsView();
  },
);

Вы можете увидеть в отладочной версии (на несколько миллисекунд отображается TermsView, и сразу эта страница будет заменена на HomeView). Если вам не нужно такое поведение, лучше использовать Provider.of(...) внутри FutureBuilder, получить значение loggedIn и продолжить.

...