1

Below is the LoginActivity class

@Inject
User injectedUser;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login2);

    MyApp.getComponent(this).inject(this); // injection completed here
}


@Subscribe public void onLoginCompleted(UserResultEvent event) 
{

    Log.e(" Finding ", injectedUser.getAuthTokenWebService());

    User user       =   event.user;
    injectedUser    =   user;  // injectedUser looses values for next activity


    // By setting each value as shown in given below two lines, 
    //I am able to get values on another activity, in my case, DashBoard class

    //injectedUser.setAuthTokenWebService(user.getAuthTokenWebService());
    //injectedUser.setUserId(user.getUserId());



    Intent intent = new Intent(LoginActivity.this, Dashboard.class);
    startActivity(intent);
}

Below is my simple Dagger Module class

@Module
public class MyAppModule
{
    private final MyApp app;

    public MyAppModule(MyApp app) {     this.app = app;       }

    @Provides @Singleton MyApp provideMyApp() {  return app;   }

    @Provides @Singleton
    Application provideApplication(MyApp app) {       return app;        }

    // getting User Object
    @Provides @Singleton  
    User provideUser(){   return new User(); }
}

and my last Dashboard activity class is

@Inject
User user;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
     super.onCreate(savedInstanceState);
     setContentView(R.layout.dashb_main);

     MyApp.getComponent(this).inject(this);

     // Here is the problem,  
     Log.e("Dashboard ", String.valueOf(user.getAuthTokenWebService())); 
}

Log.e("Dashboard ", String.valueOf(user.getAuthTokenWebService()));

gives me the default value of AuthToken, but it should print different value as it is set in LoginActivity class i.e injectedUser = user;
But this line has no effect as injectedUser variable does not retain values for the next activity, however it is set singleton in the dagger providerUser method.

I do not want to set each value got from web service by typing code as shown below

injectedUser.setAuthTokenWebService(user.getAuthTokenWebService()); 
injectedUser.setUserId(user.getUserId());

It works this way but is there any other way that injectedUser can have same values of User object fetched from service or i have to set each value as shown above ?

Saket Mittal
  • 3,726
  • 3
  • 29
  • 49
Muhammad Irfan
  • 1,447
  • 4
  • 26
  • 56
  • I found a hack... that i,. Create User reference in User Class and set and get User by setter or getter or pass it in constructor User(new User()) – Muhammad Irfan Aug 17 '15 at 10:13

1 Answers1

1

Of course it "loses values", you're just altering the pointer to the User object, and not the User object itself.

You'd need to provide a holder.

public class UserHolder {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

Then

@Module
public class MyAppModule {
    //...
    @Provides
    @Singleton
    public UserHolder userHolder(User user) {
         UserHolder userHolder = new UserHolder();
         userHolder.setUser(user);
         return userHolder;
    }

    @Provides
    @Singleton
    public User user() {
         return new User();
    }
}

Then

@Inject
UserHolder userHolder;

Log.e("Dashboard ", String.valueOf(userHolder.getUser().getAuthTokenWebService())); 

And

@Inject
UserHolder userHolder;

@Subscribe public void onLoginCompleted(UserResultEvent event) {

    Log.e(" Finding ", userHolder.getUser().getAuthTokenWebService());

    User user       =   event.user;
    userHolder.setUser(user);  
Community
  • 1
  • 1
EpicPandaForce
  • 79,669
  • 27
  • 256
  • 428