Android Dagger2 @Named用法

 如下示例代碼,在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());
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章