Как правильно сохранить значение в sharedPreferences? - флаттер - PullRequest
0 голосов
/ 09 марта 2020

Куда я иду не так? У меня есть логин с Google, чтобы получить токен и отправить его в GraphGL, этот токен сохраняется (он должен быть) в общих настройках, но не сохраняется, у меня есть следующее действие (mobx).

@action
Future loginWithGoogle() async {
 user = await _authRepository.getGoogleLogin();
 final idToken = await user.getIdToken();
 print('Bearer ${idToken.token}');
 sharedPreferenceService.setToken('Bearer ${idToken.token}');
}

Службы используются совместно.

class SharedPreferenceService {
  SharedPreferences _prefs;

  Future<bool> getSharedPreferencesInstance() async {
    _prefs = await SharedPreferences.getInstance().catchError((e) {
      print("shared prefrences error : $e");
      return false;
    });
    return true;
  }

  Future setToken(String token) async {
    await _prefs.setString('token', token);
  }

  Future clearToken() async {
    await _prefs.clear();
  }

  Future<String> get token async => _prefs.getString('token');
}

SharedPreferenceService sharedPreferenceService = SharedPreferenceService();

Действие входа в систему в поле зрения.

@action
  Future loginWithGoogle() async {
    try {
      loading = true;
      await auth.loginWithGoogle();
      Modular.to.pushReplacementNamed('/index');
    } catch (e) {
      loading = false;
    }
  }

Вход в систему происходит нормально, но он обнаруживает ошибку при переходе к индексу, информируя что он получил нуль getString ("token") .

I/flutter ( 3198): ClientException: Unhandled Failure NoSuchMethodError: The method 'getString' was called on null.
I/flutter ( 3198): Receiver: null
I/flutter ( 3198): Tried calling: getString("token")

Эта строка токена не сохраняется. Извините за плохой английский sh

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Просто скопировал ваш код и внес некоторые изменения, просто проверьте:

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  SharedPreferenceService sharedPreferenceService = SharedPreferenceService();

  @override
  void initState() {
    super.initState();
    loginWithGoogle();
    getSharedValues();
  }

  getSharedValues() async{
     bool value = await sharedPreferenceService.getSharedPreferencesInstance();
    if(value)
    print(await sharedPreferenceService.token);
  }

  loginWithGoogle() async {
    // this is the where you get your bearer, but time being I have taken sample bearer
    String token =
        'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJZb3VuaXNaYXJnYXIiLCJlbWFpbCI6InlvdW5pc0BiYXh0dXJlLmNvbSIsImp0aSI6IjlhNjc2OTVlLTBiZmEtNDdmMy04ZTVlLWVhYWMzY2VmNmRlOSIsIklkIjoiMSIsIkVtYWlsIjoieW91bmlzQGJheHR1cmUuY29tIiwiZXhwIjoxNTgzODQ2ODU0LCJpc3MiOiJQYWNpZmljIFByaW50aW5nIiwiYXVkIjoiUGFjaWZpYyBQcmludGluZyJ9.CKxBwAB7YeOKJRmoCg4_JAhJKHP2qXb7KJXPysqmbAs';

    bool value = await sharedPreferenceService.getSharedPreferencesInstance();
    if (value == true) {
      sharedPreferenceService.setToken('Bearer $token');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: Scaffold(body: Center(child: Text('sample'))));
  }
}

class SharedPreferenceService {
  SharedPreferences _prefs;

  Future<bool> getSharedPreferencesInstance() async {
    _prefs = await SharedPreferences.getInstance().catchError((e) {
      print("shared prefrences error : $e");
      return false;
    });
    return true;
  }

  Future setToken(String token) async {
    await _prefs.setString('token', token);
  }

  Future clearToken() async {
    await _prefs.clear();
  }

  Future<String> get token async => _prefs.getString('token');
}

0 голосов
/ 09 марта 2020

Большое спасибо, я сделал исправление в действии.

@action
  Future loginWithGoogle() async {
    user = await _authRepository.getGoogleLogin();
    final idToken = await user.getIdToken();
    print('Bearer ${idToken.token}');
    bool value = await sharedPreferenceService.getSharedPreferencesInstance();
    if (value == true) {
      sharedPreferenceService.setToken('Bearer ${idToken.token}');
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...