如何在 ondatachanged 之外保存 sharedpreference 变量?

How to save sharedpreference variable outside of ondatachanged?

我正在尝试在登录任务成功后从 firebase 获取用户详细信息。比如用户名、用户电话号码等,所以我想将这些详细信息存储在 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();

将您的 SharedPreferences 设置设为静态,您可以轻松访问任何 activity 和片段之间的任何位置,这将是实现此目的的最佳方式之一

public 静态 SharedPreference 设置;

那就继续使用吧,希望对你有帮助。

查询firebase异步操作,所以你必须等待直到操作完成才能获得正确的数据。除此之外,您已经在 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();
}