Flutter-存储经过身份验证的用户详细信息

时间:2020-05-24 17:44:26

标签: flutter authentication dart

我是Flutter的新手,我正在编写一个需要用户登录的应用程序。我已经有一个为我提供JWT的API。然后,我使用安全存储库来存储它。

一旦用户获得了令牌的200 OK,我想向服务器发送另一个请求以检索用户的详细信息并将其存储在单例类中,因此我可以在整个应用程序中使用它,直到他登录为止出来。现在,提供者和BLoC泛滥成灾。

我想知道将当前登录的用户详细信息存储在应用程序中的最佳实践是什么?以前,我已经知道将数据存储在单例类中。但是现在我不确定该写单例类还是提供者? (我对提供者和BLoC的工作方式仍然不了解。

2 个答案:

答案 0 :(得分:2)

从简单开始

一个简单的存储数据的起点(我假设是键/值对的形式)将使用共享首选项。

什么是共享首选项

共享首选项的主要用途是保存用户首选项,设置,甚至是数据(如果不是太大的话),以便下次启动应用程序时,可以检索和使用这些信息。

使用方法

设置“共享首选项”的实例变量,并使用键标识符存储该值。 每当您想要在应用启动时检索值时,只需使用键即可获取它。请参阅下面的示例来设置和获取存储的用户名。

Future<bool> setUserName(String value) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.setString("username",value);
}

Future<String> getUserName(String value) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getString("username");
}

安装 要安装共享的首选项,请将其添加到程序包的pubspec.yaml文件中:

dependencies:
  shared_preferences: ^0.5.7+3

有关package page的更多信息。

答案 1 :(得分:0)

解决方案1 ​​

这是我的应用存储数据的方式:

创建一个新的dart文件来存储“全局”变量,并在其中存储所有“会话”数据:

class SessionData{
  String encryptedUserId;
  String encryptedPassword;
  String encryptedToken;
  int userId;
}

SessionData globalSessionData;

//Having a clear function is pretty handy
void clearSessionData(){
  globalSessionData = new SessionData();
}

例如,如果您将文件命名为global.dart,请导入该文件,并对其读写非永久性数据(持续到应用程序关闭):

import 'global.dart' as global;
global.globalSessionData = ...;

//If you want to clear it:
global.clearSessionData();

解决方案2

如果即使应用程序关闭也要保留数据,则有两种方法可以做到:

解决方案2a

使用sharedPrefences在用户设备上存储和检索键数据值:

import 'package:shared_preferences/shared_preferences.dart';
final SharedPreferences prefs = await SharedPreferences.getInstance();
//Write different types of data
await prefs.setBool("male", true);
await prefs.setDouble("key", 7.0);
await prefs.setString("username", "Mr. User");

//Retrive different types of data
prefs.getBool("male");
prefs.getDouble("key");
prefs.getString("username");

解决方案2b

使用sqflite存储高级数据结构,因为它是功能齐全的数据库。

Flutter提供了有关using SQLite with flutter的出色教程。尽管如果使用这种类型的解决方案,则必须了解 SQL。