上回我們點了個包子外賣,這次我點了個可樂回铛。這下遇到問題了狗准,包子是自己做的克锣,在包子類內(nèi)部可以使用@inject∏怀ぃ可是可樂不是自己做的袭祟,我們不能打開啊。@inject不好用了饼酿,怎么辦榕酒?對應(yīng)的android上的問題就是,如果我要注入的類是來自第三方庫故俐,沒辦法直接修改,我就不能再該類中使用@inject紊婉。
解決這個方法是@module和provide药版。
首先,先建一個可樂的bean喻犁。有一個品牌屬性槽片,假裝是來自第三方庫的,無法修改肢础,不能加入@inject。這個沒難度传轰,大家都能理解剩盒。
public class Cola {
String brand = "百事";
Cola() {
}
}
下面建一個module慨蛙。
@Module
public class SecondActivityModule {
@Provides
Cola offerCola() {
return new Cola();
}
}
用@Module來表明這個類是Module,內(nèi)部用@Provides 下面的方法能提供我們需要的可樂類期贫。
Module相當(dāng)于一個打包盒跟匆,能夠把我們需要的可樂類裝在里面。因為這個類不能加@inject通砍,所以需要用@Module和@Provides
接下來需要告訴送餐員,要送什么到哪里去封孙。也就是要告訴dagger2的component把哪個類注入到哪個Activity。創(chuàng)建接口SecondActivityComponent如下:
import dagger.Component;
@Component(modules = SecondActivityModule.class)
public interface SecondActivityComponent {
void inject(SecondActivity activity);
}
(modules = SecondActivityModule.class)這句話的意思是告訴component需要傳送的類是在SecondActivityModule里面找敛瓷。換句話說是要送的餐點在SecondActivityModule里面叁巨。
void inject(SecondActivity activity);這句代碼的意思是告訴component,要把需要的注入的類送到SecondActivity里面呐籽。
最后锋勺,在Activity里面寫
DaggerSecondActivityComponent.builder().build().inject(this);
然后就可以在Activity里面使用Cola這個類了。
Activity代碼如下:
/**
* @author fan
*/
public class SecondActivity extends AppCompatActivity {
Button btnEat;
@Inject
Cola cola;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnEat = findViewById(R.id.eat);
btnEat.setText("喝");
DaggerSecondActivityComponent.builder().build().inject(this);
btnEat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(SecondActivity.this, "可樂品牌是" + cola.brand, Toast.LENGTH_SHORT).show();
}
});
}
}
總結(jié):
本篇講的是不能使用@inject的時候庶橱,可以使用@module和@Provides達(dá)到注入效果
demo地址 https://github.com/eminfan/DaggerDemo
下一篇 介紹module加參數(shù)
http://www.reibang.com/p/ae0ce11684ba