Câu hỏi của tôi tương tự như this.Chèn phụ thuộc vào CustomView với dao găm 2 (trong phạm vi hoạt động)
Vì vậy, ví dụ, tôi có một thực hiện LiveData
:
public class CustomLiveData extends LiveData<SomeEvent> {
@Inject
public CustomLiveData(@ActivityContext Context context) {
//....
}
}
mà tôi muốn đưa vào trong một giao diện tùy chỉnh:
public class CustomView extends View {
@Inject
SomeApplicationProvider anyProvider;
@Inject
CustomLiveData dataProvider;
// Getting @com.di.qualifiers.ActivityContext android.content.Context cannot be provided without an @Provides-annotated method.
// @com.di.qualifiers.ActivityContext android.content.Context is injected at com.repositories.CustomLiveData.<init>(context)
// com.repositories.CustomLiveData is injected at com.ui.CustomView.dataProvider com.ui.CustomView is injected at
// com.di.ApplicationComponent.inject(view)
public CustomView(Context context) { this(context, null); }
public CustomView(Context AttributeSet attrs) {
super(context, attrs);
// Works ok for application provider
Application.getComponent(context).inject(this);
}
}
Và đây là phần còn lại của lớp DI:
@ApplicationScope
@Component(
modules = {AndroidInjectionModule.class,
ActivityBuilder.class
})
public interface ApplicationComponent extends AndroidInjector<MyApp> {
void inject(MyApp application);
void inject(CustomView view);
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<MyApp> {
public abstract ApplicationComponent build();
}
}
@ActivityScope
@Module (subcomponents = MainActivitySubcomponent.class)
public abstract class ActivityBuilder {
@Binds
@IntoMap
@ActivityKey(MainActivity.class)
abstract AndroidInjector.Factory<? extends Activity>
bindActivityInjectorFactory(MainActivitySubcomponent.Builder builder);
//...
}
@Subcomponent(modules = {MainActivityModule.class})
public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {
}
}
@ActivityScope
@Module
public class MainActivityModule {
@Provides
@ActivityContext
public Context provideActivityContext(MainActivity activity) {
return activity;
}
// Seems to be wrong or not enough!?
@Provides
public CustomLiveData provideCustomLiveData(@ActivityContext Context context) {
return new CustomLiveData(context);
}
}
@Qualifier
public @interface ActivityContext{
}
Lưu ý rằng tôi không nhận được bất kỳ khiếu nại trình biên dịch nào nếu CustomLiveData
được tiêm vào MainActivity
thay vào chế độ xem. Cảm ơn!
Bạn có gặp phải bất kỳ lỗi biên dịch nào khi tiêm 'CustomLiveData' vào chế độ xem' Tùy chỉnh' không? Hãy đăng nó cùng với câu hỏi của bạn. –
thư được đưa vào phần CustomView. Xem "// Getting @ com.di.qualifiers.ActivityContext android.content.Context không thể ....." – sinek
Bạn có thể đăng '@ ActivityContext' không? –