我是新手,Dagger2并尝试构建这样的示例以了解其工作原理。
Dagger2
有我的示例代码:
MainActivity
public class MainActivity extends AppCompatActivity { @Inject protected ApiInterface apiInterface; @Inject protected Integer valueInt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); App.getComponent().inject(this); } public void testButton(View view) { if (apiInterface == null || valueInt == null) { Log.e("TAG", "apiInterface == null"); } else { Log.e("TAG", "apiInterface != null : " + apiInterface.value + " : " + valueInt); } } }
Component
@Singleton @Component(modules = {ModelModule.class, AnotherModule.class}) interface AppComponent { void inject(MainActivity mainActivity); }
Module
@Module class ModelModule { @Provides int provideInt() { return 1; } @Provides ApiInterface provideApiInterface(int i) { return ApiModule.getApiInterface(i); } }
@Module class AnotherModule { @Provides Integer getInt(){ return 3; } }
如您在MainActivity我注入的样本中所见Integer
Integer
@Inject protected Integer valueInt;
我也想使用int提供值作为此方法的参数provideApiInterface(int i)。
int
provideApiInterface(int i)
最终我得到了这样的错误
Error:(11, 10) error: java.lang.Integer is bound multiple times: @Provides int com.krokosha.aleksey.daggertwo.ModelModule.provideInt() @Provides Integer com.krokosha.aleksey.daggertwo.AnotherModule.getInt()
我究竟做错了什么?
我应该如何以正确的方式提供此参数以避免此类错误?
您需要使用 限定符注释
@Module class ModelModule { @Provides @Named("FirstInt") int provideInt() { return 1; } } @Module class AnotherModule { @Provides @Named("SecondInt") int provideInt() { return 1; } }
并在注入依赖时使用此限定符
@Inject protected ApiInterface apiInterface; @Inject @Named("FirstInt") //or whatever you need protected int valueInt;
希望能帮助到你!另请查看官方文档-http: //google.github.io/dagger/