Как сохранить переменную sharedpreference вне ondatachanged? - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь получить информацию о пользователе из firebase после успешного входа в систему. как имя пользователя, номер телефона и т. д. c. поэтому эти данные я хочу сохранить в переменной sharedpreference. так что я могу использовать эти переменные во всем приложении. но когда я пытаюсь сохранить и получить доступ извне, выбрасываю ноль.

    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {

                        mProgressDialog.dismiss();

                        SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
                          SharedPreferences.Editor editor = settings.edit();
                        FirebaseUser user = task.getResult().getUser();

                        user_tbl.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                User user1=null;
                                //Check if user not exist in database
                                if (dataSnapshot.child(user.getUid()).exists()) {

                                     user1 = dataSnapshot.child(user.getUid()).getValue(User.class);

                                 //   user_tbl.removeEventListener(this);
                                }
                                editor.putString("username", user1.getUserName());
                                editor.apply();




                            }
                            @Override
                            public void onCancelled(DatabaseError databaseError) {
                            }
                        });


                        editor.putString("logged", "logged");
                        editor.putString("email",email);

                        editor.commit();

Ответы [ 2 ]

2 голосов
/ 12 января 2020

Запрос к firebase является асинхронной операцией, поэтому вы должны дожидаться окончания sh операции, чтобы получить правильные данные. Помимо этого вы уже фиксируете текущий редактор за пределами onDataChange. Таким образом, вы должны снова запустить редактор внутри onDataChange, чтобы разобраться с этим. Проверьте ниже:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    User user1=null;
    //Check if user not exist in database
    if (dataSnapshot.child(user.getUid()).exists()) {

        user1 = dataSnapshot.child(user.getUid()).getValue(User.class);

        //   user_tbl.removeEventListener(this);
    }

    SharedPreferences.Editor editor2 = settings.edit();
    editor2.putString("username", user1.getUserName());
    editor2.apply();
}
0 голосов
/ 12 января 2020

Настройте параметры SharedPreferences как stati c, и вы сможете легко получить доступ к любому месту между любым действием и фрагментом, который будет одним из лучших способов сделать это

publi c stati c Настройки SharedPreference ;

Тогда используйте его дальше, и я надеюсь, что это помогло вам.

...