1. 程式人生 > >史上最適合新手的Dagger2教程(四)帶參注入

史上最適合新手的Dagger2教程(四)帶參注入

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 + "歲了擡起槓來依然是個扛把子";
    }
}