【问题标题】:how to check if SharedPreferences exists for this application in flutter如何在颤动中检查此应用程序是否存在 SharedPreferences
【发布时间】:2020-02-12 11:55:35
【问题描述】:

我的 Flutter 应用程序每次启动时都会检查 SharedPreferences 中保存的数据。稍后在应用程序中使用它,但是当我第一次在设备中运行该应用程序时,保存了SharedPreferences,因此它以null 获取所有数据。所以我想确保它检查文件本身是否存在而不是检查特定值,

注意:我正在使用这个shared_preferences futter 包。

这是我的代码:

  checkingTheSavedData() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String username = prefs.getString('username');
    if (username == null) {
      Navigator.pushReplacementNamed(context, '/login');
    } else {
      Navigator.pushReplacementNamed(context, '/main_page');
    }
  }

所以,对于第一次运行,它会运行 Navigator.pushReplacementNamed(context, '/main_page');,但数据为空,之后当我进行真正的登录并且数据已经保存时,它工作正常。知道如何以适当的方式处理这个问题吗?

【问题讨论】:

  • 您要问的不是shared_preferences 的工作原理。你实际上做的是对的。但是你说第一次运行还是去/main_page路线?
  • 是的,第一次运行它会进入主页并显示所有数据为空,我认为它忽略了` if (username == null) {` 因为它甚至没有在line` SharedPreferences prefs = await SharedPreferences.getInstance();` 所以我试图让它检查文件是否已经存在。
  • 调试的时候,在你做检查的那一行放一个断点,看看用户名是什么

标签: android ios flutter dart sharedpreferences


【解决方案1】:

您需要使用prefs.containsKey('username')检查密钥是否存在。

【讨论】:

  • 在NULL SAFETY的情况下,它返回NULL,如何在Null Safety中检查NULL?请建议。谢谢。
  • 你可以做同样的事情,你只需要在你调用get时强制它 - getString('username')!
  • 以下解决方案解决了我的问题。 SharedPreferences 首选项 = 等待 SharedPreferences.getInstance();字符串 userData = prefs.getString('userInfo') ?? ""; if (userData == '') { Navigator.pushNamedAndRemoveUntil( context, LoginScreen.routeName, (r) => false); } else { Navigator.pushNamedAndRemoveUntil(上下文,HomeScreen.routeName,(r)=> false); }
  • 这不是一个解决方案,当不了解 null 安全性时,这是一个 hacky 解决方法。
【解决方案2】:

因为你还没有 SharedPreferences KEY,所以你变得空了; 所以只需输入?? 运算符并返回一个值。

// Separated shared preferences method is a good call
  Future<bool> isUserLoggedIn() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getBool(IS_LOGGED_KEY) ?? false;
  }

  // Your logic
  void checkingTheSavedData() {
    isUserLoggedIn().then((isLogged) {
      if (isLogged) {
        // foo
      } else {
        // bar
      }
    });
  }

【讨论】:

    【解决方案3】:

    当我使用“shared_preferences”时,我个人使用一个助手来获取和设置,就像这样:

    获取器

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

    设置器

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

    要回答您的问题,您无法检查 SharedPreferences“文件”是否存在。你的方法已经正确了。

    【讨论】:

    • 它有效,我在我的旧项目中使用过它。谢谢。
    • prefs.setString('username', value) 返回 bool,所以我认为正确的变体是静态 Future ...
    【解决方案4】:

    虽然你已经得到了答案,但在这里我提到了我是如何在我的应用中使用的。

    使用 this 设置值

    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setBool("login", true);
    

    在登录页面通过containsKey检查

    SharedPreferences prefs = await SharedPreferences.getInstance();
         if (!prefs.containsKey("login")) {
            Navigator.of(context).push(MaterialPageRoute(
            builder: (context) {
                return LoginPage();
              },
            ));
         } 
                          
    

    也可以像这样签入注销页面

    SharedPreferences prefs = await SharedPreferences.getInstance();
        if(prefs.containsKey("login")) {
          prefs.remove("login");
          Utils.successToast("Logout successfully");
          Navigator.of(context).pop();
        }
    

    注意:你可以使用任何你想要的东西,比如“用户名”或其他东西,而不是“登录”

    【讨论】:

    • 实用程序与 DART 2 不兼容
    猜你喜欢
    • 2022-01-21
    • 2014-05-14
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多