Dagger2系列教程目錄:
史上最適合新手的Dagger2教程(五)命名玻靡、限定與延時加載
前面我們講解了構造方法中不帶參數(shù)的各種注入方式腐缤,
這節(jié)課涕刚,我們來學習構造方法中帶參數(shù)的對象如何使用Dagger2注入诲祸。
· 常規(guī)實現(xiàn)
我們先不使用Dagger2,以常規(guī)的方式注入一個帶參構造的對象:
帶參構造類:
public class SellMoe {
private int age;
public SellMoe(int age) {
this.age = age;
}
public String sellMoe() {
return "我特么" + age + "歲了還是可愛得要死";
}
}
常規(guī)調(diào)用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.textView);
SellMoe sellMoe = new SellMoe(80);
textView.setText(sellMoe.sellMoe());
}
}
運行結果:
接下來我們使用Dagger2來注入它续担。
· Dagger2注入
下面所用到的注解,在上節(jié)課有詳細的說明,如果不熟練請回顧上一節(jié)愕掏。
Step1:創(chuàng)建帶參構造模型(@Module)
對于帶參構造的對象,必須使用@Module注入籽前;并且這個模型必須有一個帶參的構造方法亭珍。
@Module
public class SellMoeModule {
private int age;
public SellMoeModule(int age) {
this.age = age;
}
}
Step2:創(chuàng)建帶參提供者(@Provides)
除了提供帶參的對象的提供者以外,還要有提供參數(shù)的提供者枝哄,二者缺一不可:
@Module
public class SellMoeModule {
private int age;
public SellMoeModule(int age) {
this.age = age;
}
//提供參數(shù)的提供者
@Provides
public int ageProvider() {
return age;
}
//提供對象的提供者
@Provides
public SellMoe sellMoeProvider(int age) {
return new SellMoe(age);
}
}
傳參的事情交給提供者來完成肄梨。
Step3:創(chuàng)建注入器(@Component)
帶參的注入器必須指定使用的模型:
//指定模型
@Component(modules = SellMoeModule.class)
public interface SellMoeComponent {
void inject(MainActivity mainActivity);
}
Step4:構建項目,生成注入器
反正養(yǎng)成習慣寫完注入器就Build一次就對了挠锥!
Step5:注入對象
使用帶參模型注入的時候众羡,就不能直接使用create()方法了,
和需要更改OkHttp3的參數(shù)時蓖租,需要使用OkHttpClient.Builder()一個道理粱侣,
這里也要使用Builder()傳入帶參的Module:
public class MainActivity extends AppCompatActivity {
@Inject
SellMoe sellMoe;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.textView);
DaggerSellMoeComponent.builder().sellMoeModule(new SellMoeModule(80)).build().inject(this);
textView.setText(sellMoe.sellMoe());
}
}
以上就是帶參對象的注入過程。
但是話又說回來蓖宦,有時候一個對象齐婴,有帶參和不帶參兩個構建方法,這個時候怎么辦嘞稠茂?
· 家庭作業(yè)
用Dagger2注入一個帶參數(shù)的杠精類,分別使用普通模式和單例模式:
public class GangJing {
private int age;
public GangJing(int age) {
this.age = age;
}
public String gang() {
return "我特么" + age + "歲了抬起杠來依然是個扛把子";
}
}