firebase - 身份验证 Firebase 与 Provider flutter

标签 firebase flutter firebase-authentication

我尝试实现此身份验证 here Firebase 与 Porvider 这里的问题是我想保存变量loggingIn的状态,即使我关闭并重新响应应用程序,所以我使用了这段代码,但不起作用

    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内部的登录情况?

最佳答案

您需要使用 FirebaseAuth.currentUser 来检查用户是否已登录,我在 Consumer 中使用 FutureBuilder 来完成这项工作。

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: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="443137213604313721366a272b29" rel="noreferrer noopener nofollow">[email protected]</a>', 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();
  }
}

关于firebase - 身份验证 Firebase 与 Provider flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62085806/

相关文章:

ios - 如何将自动续订订阅绑定(bind)到内部用户,而不是 apple id?

redux - 如何使用 Flutter 和 Redux 显示进度指示器?

javascript - 如何在 Web 应用程序中使用 Firebase 完成用户授权?

javascript - FCM 通过 JavaScript 访问 token key

ios - FaSTLane Scan 的构建过程缺少 Jenkins CI 上的 CocoaPod 框架

Firebase - Firestore - 我会阅读文档多少次

ios - 如何组织数据库结构以便能够在其中进行搜索。火力地堡和 swift

Flutter - 改变 TabBarView 的动画

android - Flutter 应用程序中每个页面的多个脚手架

IOS swift firebase auth 登录不正确