Flutter - SharedPreference not saving value - Returning NULL all time

3.6k Views Asked by At

I have implemented SharedPreference in Flutter using the following dependency:

 shared_preferences: ^0.5.12+4

My Preference class :

class Preference {
  static Future<SharedPreferences> _prefs = SharedPreferences.getInstance();

  static saveLoginInfo(VerifyUserLoginResult verifyUserLoginResult) async {
    SharedPreferences pref = await _prefs;
    pref
        .setString("user_login", jsonEncode(verifyUserLoginResult))
        .then((value) => print('User Login Value Saved : $value'));
  }

  static Future<bool> isLoggedIn() async {
    SharedPreferences pref = await _prefs;
    print('is Logged In : ${pref.getString("user_login")}');
    return pref.getString("user_login") != null;
  }
}

My logs as follow:

I/flutter (28468): User Login Value Saved : true
I/flutter (28468): is Logged In null
I/flutter (28468): is Logged In: false

Can anyone help me to save the JSON in Preference? I also want to check whether JSON is saved or not to display another screen if already logged in.

Edit:

I have called the method to save String as below:

  if (value.verifyUserLoginResult.mID == '1')
  {
    Preference.saveLoginInfo(value.verifyUserLoginResult),
    Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => Dashboard()))
  }
2

There are 2 best solutions below

1
On

Because you are not adding await before calling saveLoginInfo method. and sharedpreferences save method returns "future"

You need to add await before calling saveLoginInfo

your code should be :

await  Preference.saveLoginInfo(value.verifyUserLoginResult),
0
On

How are you calling Preference.isLoggedIn()? Maybe you are not awaiting the result?

I have reproduced your code with a test case and evertyhing worked as expected.

Preferences.dart

import 'dart:convert';

import 'package:shared_preferences/shared_preferences.dart';

class Preference {
  static Future<SharedPreferences> _prefs = SharedPreferences.getInstance();

  static saveLoginInfo(dynamic verifyUserLoginResult) async {
    SharedPreferences pref = await _prefs;
    pref
        .setString("user_login", jsonEncode(verifyUserLoginResult))
        .then((value) => print('User Login Value Saved : $value'));
  }

  static Future<bool> isLoggedIn() async {
    SharedPreferences pref = await _prefs;
    return pref.getString("user_login") != null;
  }
}

preferences_test.dart

import 'package:flutter_apph/Preferences.dart';
import 'package:flutter_test/flutter_test.dart';

void main(){
  test('sharedprefs',() async {
    Map<String,Map<String,String>> value = {
      "verifyUserLoginResult" : {
        "mID" : "1"
      }
    };
    if (value['verifyUserLoginResult']['mID'] == '1')
    {
      await Preference.saveLoginInfo(value['verifyUserLoginResult']);
      expect(
        await Preference.isLoggedIn(),
        true);
    }
  });
}