史上最適合新手的Dagger2教程(四)帶參注入
阿新 • • 發佈:2019-02-14
Dagger2系列教程目錄:
前面我們講解了構造方法中不帶引數的各種注入方式,
這節課,我們來學習構造方法中帶引數的物件如何使用Dagger2注入。
· 常規實現
我們先不使用Dagger2,以常規的方式注入一個帶參構造的物件:
帶參構造類:
public class SellMoe { private int age; public SellMoe(int age) { this.age = age; } public String sellMoe() { return "我特麼" + age + "歲了還是可愛得要死"; } }
常規呼叫:
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注入
下面所用到的註解,在上節課有詳細的說明,如果不熟練請回顧上一節。
Step1:建立帶參構造模型(@Module)
對於帶參構造的物件,必須使用@Module注入;並且這個模型必須有一個帶參的構造方法。
@Module
public class SellMoeModule {
private int age;
public SellMoeModule(int age) {
this.age = age;
}
}
Step2:建立帶參提供者(@Provides)
除了提供帶參的物件的提供者以外,還要有提供引數的提供者,二者缺一不可:
@Module
public class SellMoeModule {
private int age;
public SellMoeModule(int age) {
this.age = age;
}
//提供引數的提供者
@Provides
public int ageProvider() {
return age;
}
//提供物件的提供者
@Provides
public SellMoe sellMoeProvider(int age) {
return new SellMoe(age);
}
}
傳參的事情交給提供者來完成。
Step3:建立注入器(@Component)
帶參的注入器必須指定使用的模型:
//指定模型
@Component(modules = SellMoeModule.class)
public interface SellMoeComponent {
void inject(MainActivity mainActivity);
}
Step4:構建專案,生成注入器
反正養成習慣寫完注入器就Build一次就對了!
Step5:注入物件
使用帶參模型注入的時候,就不能直接使用create()方法了,
和需要更改OkHttp3的引數時,需要使用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());
}
}
以上就是帶參物件的注入過程。
但是話又說回來,有時候一個物件,有帶參和不帶參兩個構建方法,這個時候怎麼辦嘞?
· 家庭作業
用Dagger2注入一個帶引數的槓精類,分別使用普通模式和單例模式:
public class GangJing {
private int age;
public GangJing(int age) {
this.age = age;
}
public String gang() {
return "我特麼" + age + "歲了擡起槓來依然是個扛把子";
}
}