Kotlin怎樣使用Android的Dagger2

来源:http://www.cnblogs.com/figozhg/archive/2017/04/16/6718654.html
-Advertisement-
Play Games

作者:Antonio Leiva 時間:Apr 11, 2017 原文鏈接:https://antonioleiva.com/dagger-android-kotlin/ 在Android上,創建去耦以及容易測試代碼的幾乎每位遲早都要訴諸Dagger。 雖然,在Kotlin中設置Dagger有一些不 ...


作者:Antonio Leiva

時間:Apr 11, 2017

原文鏈接:https://antonioleiva.com/dagger-android-kotlin/

 

 

Android上,創建去耦以及容易測試代碼的幾乎每位遲早都要訴諸Dagger

 

雖然,在Kotlin中設置Dagger有一些不同,但是大多數都十分簡單,僅需要幾個步驟。今天我就在這裡講解。

 

同時要意識到,由於Kotlin的能力,還有其他方法可以解決註入問題,甚至在Kotlin中還有一些專門的庫來解決。

 

但是Dagger仍然是有效的選擇,即使不是最最通用的,也是其中之一。

 

 

提示:

 

在這篇文章中,我不會解釋怎樣使用Dagger 2,這是已知的。如果你有任何問題,可以閱讀我之前寫過一些關於依賴註入的文章

 

Dagger 2配置項目

 

如果在你的項目中,你已經配置了Kotlin插件,你需要做的就是配置kapt

 

如果你已經使用過Dagger,你大概知道apt.kaptKotlin的一個版本,它為Dagger創建了需要的自生成類。

 

為了配置它,你需要將下麵內容加入build.gradle

1 kapt {
2     generateStubs = true
3 }

 

你能夠將其加入在依賴節之前。如果願意,你能夠使用新的實驗性插件,它已經相當穩定了:

 

1 apply plugin: 'kotlin-kapt'

 

 

現在,你就需要加入Dagger編譯器的依賴關係(是使用kapt而不是包括在apk中)和實際的庫:

1 kapt 'com.google.dagger:dagger-compiler:2.5'
2 compile 'com.google.dagger:dagger:2.5'

 

這樣一切就緒,可以開始使用Dagger

 

主模塊的實現

 

 

你可能知道,對於主圖形,你需要一個Module和一個Component

 

在這個簡單的例子中,應用模塊僅返回應用自己的實例。

 

 

為了這樣做,我們將用@Module註解創建一個類,通過構造函數接收應用實例,將其保存到屬性中,用@Provides@Singleton註解的方法返回它。

1 @Module class AppModule(val app: App) {
2     @Provides @Singleton fun provideApp() = app
3 }

 

你可以看到,即使對於這樣簡單的類,其代碼也要比用Java簡單得多。

 

接著我們要實現Component,它需要載入一個模塊數組,並且說明誰能夠手動註入它:

1 @Singleton
2 @Component(modules = arrayOf(AppModule::class))
3 interface AppComponent {
4     fun inject(app: App)
5 }

 

再就只創建一個App類,它將負責生成圖片:

 1 class App : Application() {
 2 
 3     val component: AppComponent by lazy {
 4         DaggerAppComponent
 5                 .builder()
 6                 .appModule(AppModule(this))
 7                 .build()
 8     }
 9 
10     override fun onCreate() {
11         super.onCreate()
12         component.inject(this)
13     }
14 }

 

這裡看到的有趣的事是,由於lazy聲明,我們能夠在屬性的定義中指定圖形的值,因此就獲得了對該屬性的只讀訪問權。

 

 

component.inject (this)完成前,代碼定義的屬性不會被執行,所以到那時,this已經存在了,就可以安全地創建了。

 

每個模塊實現的範圍

 

 

模塊的範圍僅允許圖部分在其它的對象生命周期中生存。

 

 

用這種方法,例如,我們可以Activity生存創建子圖

 

 

 

我們會用依據需要創自己的建模塊:

 

1 @Module
2 class HomeModule(val activity: HomeActivity) {
3 }

 

 

Subcomponent非常類似前面所述方法,表明它會註入HomeActivity:

 

1 @Singleton
2 @Subcomponent(modules = arrayOf(HomeModule::class))
3 interface HomeComponent {
4     fun inject(activity: HomeActivity)
5 }

 

 

AppComponentplus方法,表示這個組件能夠加入到子組件的類型:

1 interface AppComponent {
2     ...
3     fun plus(homeModule: HomeModule): HomeComponent
4 }

 

現在,你就只需要在HomeActivity中聲明子組件:

1 val component by lazy { app.component.plus(HomeModule(this)) }

 

你可在setContentView之後註入它:

1 override fun onCreate(savedInstanceState: Bundle?) {
2     super.onCreate(savedInstanceState)
3     setContentView(R.layout.activity_main)
4     component.inject(this)
5 }

 

如果你想知道app是從哪裡來的,它是一個像這樣擴展屬性:

1 val Activity.app: App
2     get() = application as App

 

如果您有自己的自定義application,這隻是一種避免每次訪問的簡單方法。

 

結論

 

Kotlin中,使用Dagger 2也很容易。你再無有理由在Kotlin中去實現一個很大的解耦架構了。

 

如果你要學習更多的這些並且用Kotlin創建自己的Android APP,就看看免費的指南,學習怎樣建立你的第一個項目,或是直接購買這本書,學習怎樣從頭開始創建一個完整的APP

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、簡介及安裝: gulp是前端開發過程中對代碼進行構建的工具,是自動化項目的構建利器;她不僅能對網站資源進行優化,而且在開發過程中很多重覆的任務能夠使用正確的工具自動完成;使用她,我們不僅可以很愉快的編寫代碼,而且大大提高我們的工作效率 gulp的優點:基於流的操作、任務化。 常用api:src ...
  • 雪花飄落的效果實現步驟:1.使用setInterval定時器每800毫秒創建一個雪花;2.把每一個雪花作為參數傳進動態下落的方法中即可。 js實現代碼: 效果圖如下: 這樣雪花飄落的效果就做好了。有什麼不足的地方請指正! ...
  • 在上一篇文章《iOS之ProtocolBuffer搭建和示例demo》分享環境的搭建, 我們和伺服器進行IM通訊用了github有名的框架CocoaAsynSocket, 然後和伺服器之間的數據媒介是ProtoBuf。然後後面在開發的過程中也碰到了拆包和粘包問題,這方面網上資料很少,曲折了一下才解決 ...
  • Android保持屏幕常亮,PowerManager.WakeLock的使用 需要在AndroidManifest.xml中添加許可權<uses-permission android:name="android.permission.WAKE_LOCK"/> SCREEN_BRIGHT_WAKE_LO ...
  • 在使用一些產品列如微信、QQ之類的,如果有新消息來時,手機屏幕即使在鎖屏狀態下也會亮起並提示聲音,這時用戶就知道有新消息來臨了。但是,一般情況下手機鎖屏後,Android系統為了省電以及減少CPU消耗,在一段時間後會使系統進入休眠狀態,這時,Android系統中CPU會保持在一個相對較低的功耗狀態。 ...
  • 第一步: 為mac電腦配置 adb 命令的環境變數,分為2小步 1.找到 Android Studio 為你安裝的 SDK : 打開電腦中 Android studio 的工具的軟體,在啟動 Android studio 的軟體的界面中,點擊下方列表中的”configure“的選項。在點擊列表中的“ ...
  • 轉載請註明出處:http://www.cnblogs.com/cnwutianhao/p/6719380.html 作為Android開發者,一定不會對 GreenDao 和 ReactiveX 陌生。 GreenDao 號稱Android最快的關係型資料庫 ReactiveX Rx是一個編程模型, ...
  • 在使用pthread進行NDK中的多線程開發時,自己寫了一個BUG, 這個是啟動函數,即相當於Java中的Thread的run方法。初一看沒啥問題,編譯也能過,APP也能跑,但是每次都會crash。我把crash線程的log貼出來如下: 從log中看出,是記憶體訪問錯誤,然後使用addr2line工具 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...