如下示例代碼,在Module中同時提供了兩個Person的實例,如果不加以區分,就會報如下錯誤
這時候我們可以在用@Name來加以區分
error: [Dagger/DuplicateBindings] com.him.hisapp.Person is bound multiple times:
@Provides com.him.hisapp.Person com.him.hisapp.MainModule.provideStudent()
@Provides com.him.hisapp.Person com.him.hisapp.MainModule.provideTeacher()
com.him.hisapp.Person is injected at
com.him.hisapp.MainActivity.person
com.him.hisapp.MainActivity is injected at
com.him.hisapp.MainActivityComponent.inject(com.him.hisapp.MainActivity)
public interface Person {
String saySomething();
}
public class Student implements Person {
public String name;
public Student() {
this.name = "野猿新一";
}
@Override
public String toString() {
return String.format("我的名字叫%s啦", name);
}
@Override
public String saySomething() {
return toString();
}
}
public class Teacher implements Person {
public String name;
public Teacher() {
this.name = "蒼老溼";
}
@Override
public String toString() {
return String.format("我的名字叫%s啦", name);
}
@Override
public String saySomething() {
return toString();
}
}
重點在這裏,用@Named來區分相同類的不同實例
@Module
public class MainModule {
@Provides
@Named("student")
public Person provideStudent() {
return new Student();
}
@Provides
@Named("teacher")
public Person provideTeacher() {
return new Teacher();
}
}
@Component(modules = MainModule.class)
public interface MainActivityComponent {
void inject(MainActivity activity);
}
在具體要注入的地方也要通過@Named指定要注入哪一個
public class MainActivity extends AppCompatActivity {
@Inject
@Named("student")
Person person;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainActivityComponent.create().inject(this);
TextView textView = findViewById(R.id.text);
textView.setText(person.saySomething());
}
}