【问题标题】:How can store all values to a class object injected from dagger2?如何将所有值存储到从 dagger2 注入的类对象中?
【发布时间】:2015-08-14 18:10:21
【问题描述】:

下面是LoginActivity类

@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);
}

下面是我简单的 Dagger Module 类

@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(); }
}

我的最后一个仪表板活动课程是

@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()));

给我 AuthToken 的默认值,但它应该打印不同的值,因为它是在 LoginActivity 类中设置的,即injectedUser = user;
但是这一行没有效果,因为注入的用户变量不保留下一个活动的值,但是它在匕首 providerUser 方法中设置为单例。

我不想通过键入如下所示的代码来设置从 Web 服务获取的每个值

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

它以这种方式工作,但是是否有任何其他方式可以让注入用户从服务中获取相同的用户对象值,或者我必须设置每个值,如上所示?

【问题讨论】:

  • 我发现了一个黑客......我,。在 User Class 中创建 User 引用并通过 setter 或 getter 设置和获取 User 或将其传递给构造函数 User(new User())

标签: java android singleton pass-by-reference dagger-2


【解决方案1】:

当然它“失去价值”,you're just altering the pointer to the User object, and not the User object itself.

您需要提供一个支架。

public class UserHolder {
    private User user;

    public User getUser() {
        return user;
    }

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

然后

@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();
    }
}

然后

@Inject
UserHolder userHolder;

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

还有

@Inject
UserHolder userHolder;

@Subscribe public void onLoginCompleted(UserResultEvent event) {

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

    User user       =   event.user;
    userHolder.setUser(user);  

【讨论】:

    猜你喜欢
    • 2019-01-13
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    相关资源
    最近更新 更多