본문 바로가기

Android

[Android] Android Dagger2 연습 중 떴던 오류

DI를 위한 Android Dagger2 연습

@ContributesAndroidInjector을 사용법을 익히기 위해 인터넷에 예제를 보고 따라하던 중 빌드 과정에서 다음과 같은 오류가 발생하였습니다.

error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)]
 java.util.Map<java.lang.String,javax.inject.Provider
<dagger.android.AndroidInjector.Factory<? extends android.app.Activity>>>
cannot be provided without an @Provides-annotated method.

검색을 해봐도 마땅한 해결법이 나오지 않아 예제 코드를 찬찬히 살펴보던 중 빼먹은 부분이 있었습니다.

AppComponent.java (오류가 발생했을 때 코드)

@Singleton
@Component(modules = {AppModule.class, ActivityBinder.class})
public interface AppComponent extends AndroidInjector<BaseApplication> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        AppComponent.Builder application(Application application);

        AppComponent build();
    }
}

AppComponent.java (오류를 고친 코드)

@Singleton
@Component(modules = {AppModule.class, AndroidSupportInjectionModule.class, ActivityBinder.class})
public interface AppComponent extends AndroidInjector<BaseApplication> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        AppComponent.Builder application(Application application);

        AppComponent build();
    }
}

AndroidSupportInjectionModule.class를 Component에 module로 추가하여 오류를 고칠 수 있었습니다.

 

밑에는 연습을 위해 작성했던 코드들 입니다.

AppComponent.java

@Singleton
@Component(modules = {AppModule.class, AndroidSupportInjectionModule.class, ActivityBinder.class})
public interface AppComponent extends AndroidInjector<BaseApplication> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        AppComponent.Builder application(Application application);

        AppComponent build();
    }
}

AppModule.java

@Module
public class AppModule {

    public final static String PREFERENCES_NAME = "DaggerPractice";

    @Singleton
    @Provides
    public SharedPreferences provideSharedPreferences(Application application) {
        return application.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
    }

    @Singleton
    @Provides
    public String provideString() {
        return "Hello, Dagger Practice Project";
    }
}

ActivityBinder.java

@Module
public abstract class ActivityBinder {

    @ActivityScope
    @ContributesAndroidInjector
    public abstract MainActivity bindMainActivity();

}

ActivityScope.java

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

BaseApplication.java

public class BaseApplication extends DaggerApplication {

    private AppComponent appComponent;

    public BaseApplication() {
        super();
        appComponent = DaggerAppComponent.builder()
                .application(this)
                .build();
    }

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return appComponent;
    }
}

MainActivity.java

public class MainActivity extends DaggerAppCompatActivity {

    @Inject
    SharedPreferences mPreferences;

    @Inject
    String mString;

    private TextView mTextView;

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

    private void initView() {
        mTextView = findViewById(R.id.text);
        mTextView.setText(mString);
    }

}

DaggerAppComponent를 import 할 수 없을 땐 Rebuild Project를 해주면 됩니다.

Rebuild Project 위치

참고 사이트

https://black-jin0427.tistory.com/168 (정상에서 IT를 외치다)