如何在 flutter 中检查此应用程序是否存在 SharedPreferences

how to check if SharedPreferences exists for this application in flutter

我的 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'); 但是数据为空,之后当我进行真正的登录并且数据已经保存时,它工作正常。知道如何以正确的方式处理这个问题吗?

你正在变空,因为你还没有 SharedPreferences KEY; 所以只需将 ?? 运算符和 return 一个值。

// 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
      }
    });
  }

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

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

GETTER

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

SETTER

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

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

虽然你已经得到了答案,但在这里我提到了我在我的应用程序中的使用方式。

使用这个设置值

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();
    }

注意:您可以在“登录”

上使用任何您想要的东西,例如 'username' 或其他东西