初學Dagger之Hello Dagger(0)

寫作背景
這幾天在學習Dagger、MVP、Agera,這里所說的Dagger即Google接手的Dagger,也被稱作Dagger 2。跟著demo與一些技術博客學習,發(fā)現(xiàn)對于一個未曾使用過類似框架的人來說上手很困難,因此撰 初學Dagger 系列學習筆記,以一名初學者的視角來分享自己的學習經(jīng)驗,希望讓大家上手更順利。本文集將隨Winter的學習進度更新。

Hello Dagger

環(huán)境配置
我比較喜歡從功能入手來了解一個框架,所以讓我們從Hello Dagger開始吧。

用 Android Studio 新建一個項目,選擇 Empty Activity

如上圖,新建一個項目 Hello Dagger, 選擇 Empty Activity 模版。項目創(chuàng)建好后,在build.gradle(Project: HelloDagger)文件中的dependencies內(nèi)添加

 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

在build.gradle(Module: app)文件中最外層的上方添加

apply plugin: 'com.neenbedankt.android-apt'

繼續(xù)在該文件內(nèi)的dependencies內(nèi)添加

// apt command comes from the android-apt plugin
apt 'com.google.dagger:dagger-compiler:2.2'
compile 'com.google.dagger:dagger:2.2'
provided 'javax.annotation:jsr250-api:1.0'

這樣,Dagger的環(huán)境便配置好了,下面讓我們來開心地實現(xiàn)Hello Dagger.

代碼實現(xiàn)
官方的例子有點復雜,我表示看起來很吃力,所以,這里我們實現(xiàn)一個最簡單的Dagger demo就好了: 點擊按鈕,獲取Dagger注解的一個String,并顯示Toast。
首先,在activity_main布局中添加一個按鈕, 用于觸發(fā)事件,如下:

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Say hello"/>

然后創(chuàng)建建一個類文件 AppModule

@Module
public class AppModule {
@Provides
String provideHello() {
return "hello dagger";
}
@Provides
@Named("hi")
String provideHi() {
return "hi dagger";
}
}

@Module : 依賴的提供者,通俗的說就是該類負責提供數(shù)據(jù)內(nèi)容;
@Provides : 負責提供值,被注解的方法提供返回參數(shù)類型的數(shù)據(jù),如果同一個module中多個provides返回參數(shù)類型一致,那么必須加@Named("xxx")以進行區(qū)分,其實xxx才是該provides的真正名字,方法名沒有什么意義。
再來創(chuàng)建一個接口文件 AppComponent

@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}

@Component :依賴的注入者,AppComponent在編譯時會自動生成 DaggerAppComponent文件,因為modules = {AppModule.class},所以DaggerAppComponent可以訪問AppModule.class內(nèi)的內(nèi)容,接口內(nèi)有方法 void inject(MainActivity activity) ,所以該接口也可以訪問MainActivity,因而可以成為MainActivity與AppModule.class之間的橋梁。
先編譯一下,使AppComponent生成DaggerAppComponent文件,接著在MainActivity的onCreate()方法內(nèi)添加以下代碼

DaggerAppComponent.builder()
.appModule(new AppModule())
.build()
.inject(this);

這樣一來,AppModule內(nèi)的內(nèi)容便注入到MainActivity中了,現(xiàn)在我們可以在MainActivity中訪問AppModule里面的內(nèi)容了,訪問方式如下,在MainActivity中添加全局變量

@Inject
String hello;
@Inject
@Named("hi")
String hi;

@Inject :需要注入依賴的地方,Dagger 會構(gòu)造一個該類的實例并滿足它所需要的依賴,通俗地說就是該變量被初始化為AppModule中@Provides且同類型同名(@Named相同)的方法的返回值了。
感覺還是挺神奇,這里為了方便把注入寫在MainActivity中了,如果在Application中注入,那么僅需初始化一次,該Application下的所有類都能訪問了。
好了,為按鈕添加點擊事件,并showToast看看。
Demo地址如下:
https://github.com/XunMengWinter/HelloDagger

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 第一部分 dagger2是一個依賴注入的框架,舉個例子如果我們不適用dagger注入,我們調(diào)用一個對象必須使用構(gòu)造...
    王學崗閱讀 1,835評論 5 21
  • Dagger官網(wǎng)[https://github.com/google/dagger]Dagger Document...
    _九卿_閱讀 1,108評論 0 1
  • V2.16 Summary 在任何應用程序中,最好的類都是那些做事情的類:BarcodeDecoder、Koopa...
    屰沨閱讀 335評論 0 0
  • dagger2三年前寫項目就一直在用,今天再炒一次剩飯,總結(jié)歸納,便于以后復習 dagger2理解 一個很厲害的"...
    奮斗小青年Jerome閱讀 642評論 0 6
  • 二 在我小的時候,很喜歡聽我姑婆講故事,她最愛講的是“小時拿針,長大偷金”的故事。故事講述的是古代有...
    霰雪1973閱讀 253評論 0 1

友情鏈接更多精彩內(nèi)容