简体   繁体   English

Dagger 2不初始化变量

[英]Dagger 2 doesn't initialize a variable

Now i'm trying to implement dagger in my project, and I have a one problem. 现在我正在尝试在我的项目中实施匕首,我有一个问题。 Variable that initializes in application component doesn't initialized in my activity. 在应用程序组件中初始化的变量未在我的活动中初始化。 Here is my code. 这是我的代码。 Application: 应用:

public class MyApplication extends Application {
    private ApplicationComponent applicationComponent;
    @Inject
    public Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        applicationComponent = DaggerApplicationComponent.builder().applicationModule(new ApplicationModule(this)).build();
        applicationComponent.inject(this);
    }

    public ApplicationComponent getApplicationComponent() {
        return applicationComponent;
    }
}

Here variable context != null 这里变量context!= null

Activity: 活动:

public class MainActivity extends AppCompatActivity {
    private ActivityComponent activityComponent;
    @Inject
    Context context;

    @Override
    protected void onStart() {
        super.onStart();
        activityComponent = DaggerActivityComponent.builder()
                .activityModule(new ActivityModule(this))
                .applicationComponent(((MyApplication) getApplication()).getApplicationComponent())
                .build();
        activityComponent.inject(this);
    }
}

Here context == null. 这里context == null。

Dagger: 匕首:

@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
    void inject(MyApplication application);
    Context getApplicationContext();
}

@Component(modules = {ActivityModule.class}, dependencies = {ApplicationComponent.class})
public interface ActivityComponent {
    void inject(MainActivity mainActivity);
}

@Module
public class ApplicationModule {
    private Application application;

    public ApplicationModule(MyApplication application) {
        this.application = application;
    }

    @Provides
    Context provideApplicationContext() {
        return application.getApplicationContext();
    }
}

@Module
public class ActivityModule {
    Activity activity;

    public ActivityModule(MainActivity activity) {
        this.activity = activity;
    }
}

So, dagger provide "Context" only in application class, but does not provide it in MainActivity class. 因此,dagger仅在应用程序类中提供“Context”,但不在MainActivity类中提供它。 What i'm do wrong? 我做错了什么? May be I have to change something. 可能是我要改变一些东西。

Thanks! 谢谢!

Set it up like this: 设置如下:

public class MyApplication extends Application {
  private ApplicationComponent applicationComponent;

  @Override
  public void onCreate() {
    super.onCreate();
    applicationComponent = DaggerApplicationComponent.builder()
            .applicationModule(new ApplicationModule(this))
            .build();
  }

  public ApplicationComponent getApplicationComponent() {
    return applicationComponent;
  }
}

and your activity: 和你的活动:

public class MainActivity extends AppCompatActivity {

  @Inject
  Context context;

  @Override
  protected void onStart() {
    super.onStart();
    ((MyApplication) getApplication()).getApplicationComponent().inject(this);
  }
}

This is honestly just a guess, but you should try scoping your components. 老实说,这只是猜测,但您应该尝试确定组件的范围。

@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
    void inject(MyApplication application);
    Context getApplicationContext();
}

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}

@ActivityScope
@Component(dependencies={ApplicationComponent.class}, modules={ActivityModule.class})
public interface ActivityComponent extends ApplicationComponent {
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM