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를 해주면 됩니다.
참고 사이트
'Android' 카테고리의 다른 글
[Android] EditText가 아닌 다른 곳 클릭시 키보드 내리기 (0) | 2020.02.02 |
---|---|
[Android] Activity Stack, Task 확인하기 (0) | 2020.01.31 |
[Android] Task와 Task Affinity에 대한 나의 이해 (0) | 2020.01.29 |
[Android] Translate Animation과 클릭 이벤트 (0) | 2019.12.23 |
[Android] Ripple Effect (눌렀을 때 변하는 Background) (0) | 2019.12.11 |