【问题标题】:Flutter - Storing Authenticated User detailsFlutter - 存储经过身份验证的用户详细信息
【发布时间】:2020-09-11 08:31:37
【问题描述】:

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

一旦用户使用令牌获得 200 OK,我想向服务器发送另一个请求以检索用户的详细信息并将其存储在一种单例类中,这样我就可以在整个应用程序中使用它,直到他登录出去。现在有很多流行语向我抛出,提供者和 BLoC。

我想知道在应用程序中存储当前登录用户详细信息的最佳做法是什么?以前我一直知道将数据存储在单例类中。但是现在我不确定我应该写一个单例类还是一个提供者? (我对 Providers 和 BLoC 如何工作的知识仍然生疏)。

【问题讨论】:

    标签: flutter authentication dart


    【解决方案1】:

    解决方案 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。

    【讨论】:

      【解决方案2】:

      从简单开始

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

      什么是共享偏好

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

      如何使用

      设置 Shared Preferences 的实例变量并将值与键标识符一起存储。 任何时候您想在应用程序启动时检索该值,只需使用密钥获取它。请参阅下面设置和获取存储用户名的示例。

      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的更多信息。

      【讨论】:

      • 来自 Android,我知道将用户设置存储在 SharedPreferences 中,但是不将敏感信息存储在其中是一个常见规则。因此,我使用安全存储库的原因。但是,在我的问题的上下文中,我仍然不会将用户的数据(例如姓名、个人资料图片、电子邮件)存储在 SharedPreferences 中。我正在寻找替代方案,最好是单例类。
      猜你喜欢
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2019-06-20
      • 2011-05-23
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多