2015-10-13 15 views
0

我刚开始使用Retrofit,匕首& MVP,我遇到了一个我不太明白的问题。使用匕首获得一个错误并拥有一个基类

我有一个API组件&模块,看起来像这样:

ApiModule:

@Module 
public class ApiModule { 
    @Provides @NonNull @Singleton 
    public Api provideApi(RestAdapter restAdapter){ 
     return restAdapter.create(Api.class); 
    } 

    @Provides @NonNull @Singleton 
    public RestAdapter provideRestAdapter(){ 
     return ApiRestAdapter.getInstance(); 
    } 
} 

ApiComponent:

@Singleton 
@Component(modules = { 
     ApiModule.class 
}) 
public interface ApiComponent { 
    Api api(); 

    void inject(BaseActivity activity); 
} 

我有一个基底活动,看起来像这样:

public abstract class BaseActivity extends AppCompatActivity { 

    @Inject 
    protected Api api; //this can be used by any activity that is extending BaseActivity 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 

     //create the api component 
     ApiComponent component = DaggerApiComponent.builder() 
       .apiModule(new ApiModule()) 
       .build(); 

     component.inject(this);//perform field injection 
    } 
} 

这样,任何类都可以访问Api类来完成他们想做的任何事情。 我也有一个名为WalkthroughActivity的活动,它实现了一个View并且有一个将要被注入的Presenter。我也为此创建了一个模块和组件。 WalkthroughActivityModule:

@Module 
public class WalkthroughActivityModule { 

    @Provides @NonNull @Singleton 
    public WalkthroughActivityPresenter providePresenter(){ 
     return new WalkthroughActivityPresenter(); 
    } 
} 

WalkthroughActivityComponent:

@Singleton 
@Component(
     modules = { 
       WalkthroughActivityModule.class 
     } 
) 
public interface WalkthroughActivityComponent { 

    WalkthroughActivityPresenter walkthroughActivityPresenter(); 

    void inject(WalkthroughActivity walkthroughActivity); 
} 

WalkthroughActivity:

public class WalkthroughActivity extends BaseActivity implements WalkthroughActiviyView { 

    @Inject WalkthroughActivityPresenter walkthroughActivityPresenter; 

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

     DaggerWalkthroughActivityComponent.builder() 
       .walkthroughActivityModule(new WalkthroughActivityModule()) 
       .build() 
       .inject(this); 

     showWalkthroughPager(); 
    } 
} 

我得到一个错误说这个:

Error:(26, 10) error: com.myapp.api.Api cannot be provided without an @Provides- or @Produces-annotated method. 
com.myapp.ui.base.BaseActivity.api 
[injected field of type: com.myapp.api.Api api] 

我的直接猜测是,它与WalkThorughActivity扩展BaseActivity有关。或者也许它与范围界定有关。但我不太明白如何在这个问题上包裹我的头。有人能解释为什么会发生这种情况吗?

在此先感谢!

回答

1

1)可以注入的依赖关系WalkthroughActivity在WalkthroughActivityComponent其中没有关于ApiModule

2)不能通过父类注入依赖思想。你应该这样做

class BaseActivity { 
    @Inject Foo foo 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState) 
     ApiComponent component = DaggerApiComponent.builder() 
       .apiModule(new ApiModule()) 
       .build(); 
     injectDependencies(component) 
    } 

    public abstract void injectDependencies(Component component); 
} 

class ChildActivity extends BaseActivity { 
    @Override 
    public void injectDependencies(ApiComponent component) { 
     component.inject(this); 
    } 
} 

@Singleton 
@Component(modules = { 
     ApiModule.class 
}) 
public interface ApiComponent { 
    Api api(); 
    void inject(ChildActivity activity); // Injecting into child object 
} 
+0

当我需要注入多个组件时会发生什么?那么,如果我想在WalkthroughActivity中注入WalkthroughActivityComponent&ApiComponent呢? – Sree

+0

你可以在调用super.onCreate之后在重写方法中注入ApiComponent并在WalkthroughActivity#onCreate()中注入WalkthroughActivityComponent。或者你可以在BaseActivity上使用ApiComponent的getter,并在injectDepencencies中使用它来获取所需的组件。这样您就不必将组件传递给此方法,并且将来可以添加其他组件。例如,如果您的WalkthroughActivity需要某些应用程序级别组件的依赖性,则可以在Application类上为该组件实现getter,并使用适当的injectDependency方法调用它。 –

相关问题