Flutter ios разделяет предпочтение, показывает settring при нулевой ошибке - PullRequest
0 голосов
/ 11 мая 2019

У меня есть приложение-флаттер, при входе в который я вызывал общие предпочтения для сохранения некоторого значения, например, токен, идентификатор пользователя и т. д. Все это хорошо работает как на iOS, так и на Android. Внезапно теперь на ios, это дает мне NoSuchMethodError: метод 'setString' был вызван на нуль

Вот фрагмент кода.

try {
          //final jsonResponse = json.decode(responseJson);
          Login login1 = new Login.fromJson(responseJson);
          token = login1.token;
          print(login1.fleetID);

          await AuthUtils.insertDetails(_sharedPreferences, responseJson);
        } catch (Err) {
          print("ERrro is at" + Err.toString());
        }
The whole of this function it self is async.

Below is the function where I call the to insert details.

static insertDetails(SharedPreferences prefs, var response) async {     
    print("Token is :"+response['token']);
    print("userID is :"+response['userID']);    

    await prefs.setString(authTokenKey, response['token']);
        await prefs.setString(userIdKey, response['userID']);   

    }

Я напечатал, что токен и идентификатор пользователя не пусты или не равны нулю. Но я все еще получаю сообщение об ошибке ' setString ' было вызвано пустым значением. Но это прекрасно работает на Android только IOS

Просто добавлю, я нашел это ниже.

Получатель: null. Пробный вызов: setString ("auth_token", "EyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NTc2MDAzNTcsImV4cCI6MTU1NzYwNjM1NywianRpIjoiNmExOE9CTE9m")

1 Ответ

1 голос
/ 12 мая 2019

В insertDetails вы передаете null для prefs, поэтому, когда вы пытаетесь выполнить prefs.setString, это не получается.

Собираем воедино другие детали из ваших заданных вопросов, потому что передаваемое вами значение не инициализировано (пока).

У тебя слишком сложные вещи. У вас есть переменная-член

  Future<SharedPreferences> _prefs = SharedPreferences.getInstance();

это просто ничего не делает. SharedPreferences является одноэлементным, поэтому нет ничего плохого в том, чтобы просто получить ссылку, когда она вам понадобится.

Также следует отметить, что нет необходимости ждать результата .setString() в общих настройках. Новое значение немедленно записывается в кэш в памяти, а собственный запрос отправляется на уровень Android или iOS, чтобы зафиксировать его в хранилище.

Refactor insertDetails вот так:

  static insertDetails(var response) async {
    print('Token is : ${response['token']}');
    print('userID is : ${response['userID']}');

    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString(authTokenKey, response['token']);
    prefs.setString(userIdKey, response['userID']);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...