在Fragment类中未调用FirebaseAuth.AuthStateListener

ojo*_*ifu 1 android firebase firebase-authentication

MainActivity中包含的导航抽屉导航到多个片段.在这些Fragment类的onCreate方法中,我试图onAuthStateChanged获取当前用户:

FirebaseAuth.AuthStateListener mAuthListener;
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            user = firebaseAuth.getCurrentUser();
            if (user != null ) {
                Log.e(TAG, "onAuthStateChanged:signed_in" + user.getUid());

            } else { //user is not logged in

                Log.e(TAG, "onAuthStateChanged:signed_out");

            }

        }
    };
   }
Run Code Online (Sandbox Code Playgroud)

但从onAuthStateChanged未被称为.类似的代码MainActivity工作得很好.我试过在片段的方法onCreateView()和调用onResume()方法中调用此代码,但没有任何反应.为了解决这个问题并获得当前用户,我在MainActivity中创建了一个方法:

 public FirebaseUser getFirebaseUser() {
    return user;
 }
Run Code Online (Sandbox Code Playgroud)

然后通过执行以下操作调用Fragment类中的方法:

FirebaseUser user = ((MainActivity) getActivity()).getFirebaseUser();

if (user != null ) {
            Log.e(TAG, "onAuthStateChanged:signed_in" + user.getUid());

        } else { //user is not logged in

            Log.e(TAG, "onAuthStateChanged:signed_out");

        }
Run Code Online (Sandbox Code Playgroud)

一切正常.我的问题是,为什么我不能打电话

mAuthListener = new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
      ...
Run Code Online (Sandbox Code Playgroud)

从我的片段类?

ojo*_*ifu 5

感谢@ArnisShaykh,我发现我没有打电话:

public void onStart(){
    super.onStart();
    firebaseAuth.addAuthStateListener(mAuthListener); //firebaseAuth is of class FirebaseAuth
}
Run Code Online (Sandbox Code Playgroud)

在Fragment类中.

记得还要加:

@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        firebaseAuth.removeAuthStateListener(mAuthListener);
    }
}
Run Code Online (Sandbox Code Playgroud)