如何使用Flutter保持登录状态

时间:2020-08-11 10:04:12

标签: firebase flutter dart firebase-authentication

假设/您要实现的目标

当前,我正在学习使用Flutter + Firebase开发应用程序。

我想实现以下功能作为登录功能的一部分。

  • 切换到登录页面,仅在首次登录时登录

  • 除非您注销,否则退出应用程序后打开应用程序不会带您进入登录页面

我自己做了一些研究并尝试了这些方法,但是它们没有用。 作为具体方法,如何实现上述功能?

此外,我目前正在实现使用Firebase的电子邮件和密码的功能。

即使对于Google登录和Facebook登录,还是实现上述功能的常用方法?

由于我是Flutter的新学生,所以我有很多我不了解的东西,但希望您能教给我。

当前已实现

  • 使用Firebase身份验证登录功能
  • 使用Firebase Cloud Store的数据库

我尝试过的

  • 使用Firebase身份验证的当前用户检查登录状态

其他信息(固件/工具版本等)

已使用

  • FirebaseAuth

  • FirebaseCloudStore

class MyApp extends StatelessWidget {
  // This widget is the root of your application.

  final UserState user = UserState();

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<UserState>.value(
        value: user,
        child: MaterialApp(
          // Hide debug label
          debugShowCheckedModeBanner: false,
          title:'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: LoginCheck(),
          initialRoute: "/",
          routes:<String, WidgetBuilder>{
// "/": (BuildContext context) => LoginPage(),
            AddRecord.routeName: (BuildContext context) => AddRecord(),
            "/login":(BuildContext context) => LoginPage(),
            "/home":(BuildContext context) => PageManager()
          },
        )
    );
  }
}

class LoginCheck extends StatefulWidget{
  LoginCheck({Key key}): super(key: key);

  @override
  _LoginCheckState createState() => _LoginCheckState();

}

class _LoginCheckState extends State<LoginCheck>{

  @override
  void initState(){
    super.initState();
    checkUser();

    // TODO: implement initState


  }
  void checkUser() async{
    final UserState userState = Provider.of<UserState>(context);
    final currentUser = await FirebaseAuth.instance.currentUser();
    print(currentUser);
    if(currentUser == null){
      Navigator.pushReplacementNamed(context,"/login");
    }else{
      userState.setUser(currentUser);
      Navigator.pushReplacementNamed(context, "/home");
    }
  }
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      body: Center(
        child: Container(
          child: Text("Loading..."),
        ),
      ),
    );
  }
}

0 个答案:

没有答案