Как использовать SharedPreferences в Blo c и rxdart Pattern? - PullRequest
0 голосов
/ 26 апреля 2020

как сохранить ответы API? Я сделал это как кодирование ниже. Первоначально я заставил это работать, но теперь я не могу. есть ли проблема с моим кодированием. может кто-нибудь может помочь мне

login blo c: здесь я беру ответы API и сохраняю их в SharedPreferences

class LoginBloc extends Object with Validators{
  final _repository = EresidenceRepository();
  final _userid = BehaviorSubject<String>();
  final _password = BehaviorSubject<String>();
  final _imei = BehaviorSubject<String>();
  final _coordinate = BehaviorSubject<String>();
  final BehaviorSubject<ApiResponse<login_responses>> _subject = BehaviorSubject<ApiResponse<login_responses>>();

  Function(String) get userid => _userid.sink.add;
  Function(String) get password => _password.sink.add;
  Function(String) get imei => _imei.sink.add;
  Function(String) get coordinate => _coordinate.sink.add;

  Stream<String> get useridValidation => _userid.stream.transform(useridValidator);
  Stream<String> get passwordValidation => _password.stream.transform(passwordValidator);
  Stream<bool> get submitCheck => Rx.combineLatest2(useridValidation, passwordValidation, (e,p) => true);

  login() async {
    _subject.sink.add(ApiResponse.loading("Logging In..."));
    try {
      login_responses response = await _repository.login(
          _userid.value, _password.value, _imei.value, _coordinate.value);

//      Save responses
      prefsBloc.changePrefsLogin(
          PrefsState(false, response.data.userid, response.data.password, _imei.value, _coordinate.value, "")
      );

      _subject.sink.add(ApiResponse.completed(response));

      print(response);

    } catch (e) {
      _subject.sink.add(ApiResponse.error(e.toString()));
      print(e);
    }
  }

  dispose(){
    _userid.close();
    _password.close();
    _imei.close();
    _coordinate.close();
    _subject.close();
  }

  BehaviorSubject<ApiResponse<login_responses>> get subject => _subject;

}

SharedPreferences Blo c:

This blo c функции для хранения и поиска данных.

class PrefsState {
  final bool checklogin;
  final String userid;
  final String password;
  final String imei;
  final String coordinate;
  final String bit61;

  PrefsState(this.checklogin, this.userid, this.password, this.imei, this.coordinate, this.bit61);
}

class PrefsBloc {
  final _changePrefernce = BehaviorSubject<PrefsState>();
  Function(PrefsState) get changePrefsLogin => _changePrefernce.sink.add;
  Stream<PrefsState> get prefrenceLogin => _changePrefernce.stream;
  SharedPreferences sPrefs;

  dispose(){
    _changePrefernce?.close();
  }

  PrefsBloc(){
    _loadLoginPref();
    _changePrefernce.stream.listen(_saveLoginPref);
  }

  Future<void> _loadLoginPref() async {
    sPrefs = await SharedPreferences.getInstance();
    final checkPref = sPrefs.getBool("checkLogin") ?? false;
    final useridPref = sPrefs.getString("userid") ?? "";
    final passwordPref = sPrefs.getString("password") ?? "";
    final imeiPref = sPrefs.getString("imei") ?? "";
    final coordinatePref = sPrefs.getString("coordinate") ?? "";
    final bit61 = sPrefs.getString("bit61") ?? "";
    _changePrefernce.add(PrefsState(checkPref, useridPref, passwordPref, imeiPref, coordinatePref, bit61));
  }

  void _saveLoginPref(PrefsState stats){
    if (stats != null) {
      if (sPrefs != null) {
        sPrefs.setBool("checkLogin", stats.checklogin);
        sPrefs.setString("userid", stats.userid);
        sPrefs.setString("password", stats.password);
        sPrefs.setString("imei", stats.imei);
        sPrefs.setString("coordinate", stats.coordinate);
        sPrefs.setString("bit61", stats.bit61);
        sPrefs.commit();
      }
    }
  }

  Future<void> removeLoginPref(BuildContext context) async{
    sPrefs = await SharedPreferences.getInstance();
    if(sPrefs != null) {
      await sPrefs.clear();
      AppRoutes.pushAndRemoveUntil(context, LoginPage());
    }
  }

  Future<void> checkLoginPref(BuildContext context) async{
    sPrefs = await SharedPreferences.getInstance();
    if(sPrefs.getBool("checkLogin") == true){
      AppRoutes.pushAndRemoveUntil(context, MainApp());
    }
  }

}

final prefsBloc = PrefsBloc();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...