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());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值