最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android Hilt依賴注入的使用講解

 更新時間:2023年01月16日 11:56:55   作者:FranzLiszt1847  
這篇文章主要介紹了Android Hilt依賴注入的使用,首先,某個類的成員變量稱為依賴,如若此變量想要實例化引用其類的方法,可以通過構造函數傳參或者通過某個方法獲取對象,此等通過外部方法獲取對象實例的稱為依賴注入

什么是依賴注入

首先,某個類的成員變量稱為依賴,如若此變量想要實例化引用其類的方法,可以通過構造函數傳參或者通過某個方法獲取對象,此等通過外部方法獲取對象實例的稱為依賴注入;而依賴注入又可以簡單分為手動注入和自動注入兩種方式;Hilt就是基于Dagger進行場景化優(yōu)化的一個依賴注入庫,Hilt是Google專門為Android平臺打造的一個依賴注入庫,在使用上極大程度進行啦簡化(與dagger相比)

使用依賴注入的好處

Google文檔中介紹的優(yōu)勢如下:

  • 重用代碼
  • 易于重構
  • 易于測試

簡單來說,在開發(fā)中某些內容需要進行層層手動調用,而且需要手動進行實例化;對于Hilt而言,它可以自動進行依賴注入,并且為項目中的每個 Android 類提供容器并自動管理其生命周期;某些需要全局使用的數據,可以通過Hilt進行共享,從而簡化代碼

Hilt中常用的預定義限定符

@HiltAndroidApp

所有使用 Hilt 的應用都必須包含一個帶有 @HiltAndroidApp 注解的 Application 類。@HiltAndroidApp 會觸發(fā) Hilt 的代碼生成操作,生成的代碼包括應用的一個基類,該基類充當應用級依賴項容器,記得此Application類要在清單文件中進行引用

@HiltAndroidApp
class App : Application() { ... }

@AndroidEntryPoint

如果某個Activity要使用Hilt依賴注入,就必須給Activity添加@AndroidEntryPoint注解,同理Activity中的某個Fragment也需要使用,也必須添加@AndroidEntryPoint注解;

目前Hilt 支持以下 Android 類:

  • Application(通過使用 @HiltAndroidApp)
  • ViewModel(通過使用 @HiltViewModel)
  • Activity
  • Fragment
  • View
  • Service
  • BroadcastReceiver
@AndroidEntryPoint
class MainActivity : ComponentActivity() {...}

@Module

Hilt帶有一個模塊的類,使用@Module注解的類,它會告知Hilt,它提供了哪些實例,通常和@Provider搭配使用,必須通過@InstallIn注解為其添加作用域

@InstallIn

對于您可以從中執(zhí)行字段注入的每個 Android 類,都有一個關聯的 Hilt 組件,您可以在 @InstallIn 注解中引用該組件。每個 Hilt 組件負責將其綁定注入相應的 Android 類。

Android 組件默認綁定
SingletonComponentApplication
ActivityRetainedComponentApplication
ViewModelComponentSavedStateHandle
ActivityComponentApplication 和 Activity
FragmentComponentApplication、Activity 和 Fragment
ViewComponentApplication、Activity 和 View
ViewWithFragmentComponentApplication、Activity、Fragment 和 View
ServiceComponentApplication 和 Service
@Module
@InstallIn(SingletonComponent::class)
object AppModule {...}

@Provides

如果想要讓Hilt知道,提供了哪些實例對象,可以使用@Provides進行注解,以下提供啦一個數據庫實例,并且作用域是全局單例

    @Provides
    @Singleton
    fun providerAccountBean():AccountBean{
        return AccountBean("FranzLiszt","123456")
    }

@Inject

如果想要使用Hilt自動進行啦依賴注入的對象,可以使用@Inject注解進行調用;如下,無需進行實例化,它會自動引用providerAccountBean()提供的對象

@Inject lateinit var bean: AccountBean

@HiltViewModel

通過名稱就可以了解,它需要與ViewModel類聯合使用,作用于ViewModel上;如下,與@Inject結合使用,在構造函數引用啦上述Hilt提供的對象

@HiltViewModel
class AccountViewModel @Inject constructor(private val bean: AccountBean):ViewModel() {...}

Hilt的使用

依賴

第一步:在project/build.gradle中添加如下代碼

plugins {
    ...
    id 'com.google.dagger.hilt.android' version '2.44' apply false
}

第二步:在app/build.gradle中添加如下代碼

plugins {
    ...
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
}

第三步:在app/build.gradle中添加如下代碼

   //Dagger - Hilt
    implementation("com.google.dagger:hilt-android:2.44")
    kapt("com.google.dagger:hilt-android-compiler:2.44")

    // Compose dependencies
    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-beta01"
    implementation "androidx.hilt:hilt-navigation-compose:1.0.0-alpha03"

第四步:在app/build.gradle中添加如下代碼

android{
...
 compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

建立實體類

data class AccountBean(var username:String,var password:String)

添加Hilt入口

@HiltAndroidApp
class APP:Application() {}

提供對象

此處作為用例,只是簡單寫一個測試用例,在函數中可以編寫復雜的程序,并不會影響程序性能,在程序初始化編譯時會耗時一丟丟。一下提供啦單例AccountBean對象

@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides
    @Singleton
    fun providerAccountBean():AccountBean{
        return AccountBean("FranzLiszt","123456")
    }
}

獲取對象

給Activity添加HiltAndroidEntryPoint注解,然后可以通過Inject注解獲取上面providerAccountBean方法提供的對象

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    @Inject lateinit var bean: AccountBean
    ...
    }

然后就可以直接進行對象引用

  @Composable
    fun showAccountInfo() {
        Column(
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = bean.username)
            Spacer(modifier = Modifier.height(20.dp))
            Text(text = bean.password)
        }
    }

應用與ViewModel中

在ViewModel中使用HiltViewModel注解,然后就可以使用Inject注解獲取Hilt自動注入依賴的對象

@HiltViewModel
class AccountViewModel @Inject constructor(private val bean: AccountBean):ViewModel() {...}

定義兩個具有狀態(tài)的成員變量,其中AccountState是一個數據類,具有text和hint兩個成員變量

private val _usernameState = mutableStateOf(AccountState(
        hint = "input username"
    ))
    val usernameState:State<AccountState> = _usernameState
    private val _passwordState = mutableStateOf(AccountState(
        hint = "input password"
    ))
    val passwordState:State<AccountState> = _passwordState

在ViewModel初始化函數中,將Hilt提供的對象的值賦值給VM中的兩個狀態(tài)變量

init {
        _usernameState.value = usernameState.value.copy(text = bean.username)
        _passwordState.value = passwordState.value.copy(text = bean.password)
    }

通過外部事件進行對應處理,外部輸入框不斷進行值修改,此處同步給VM中的狀態(tài)變量

   fun onEvent(event: AccountEvent){
        when(event){
            is AccountEvent.ChangeUsername ->{
                _usernameState.value = usernameState.value.copy(text = event.value)
            }
            is AccountEvent.ChangePassword ->{
                _passwordState.value = passwordState.value.copy(text = event.value)
            }
        }
    }

使用

此處直接獲取ViewModel的兩個成員變量值,然后與兩個輸入框進行綁定,通過監(jiān)聽輸入框的onValueChange方法,當其值不斷修改時,然后調用VM中的onEvent方法,然后修改VM中的狀態(tài)內容,由于輸入框綁定了VM的狀態(tài)變量,然后狀態(tài)變量值改變后,相對應的UI界面會進行重組

    @Composable
    fun showAccountInfo (viewModel: AccountViewModel = hiltViewModel()){
        val username = viewModel.usernameState.value
        val password = viewModel.passwordState.value
        Column(
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            TextField(
                value = username.text,
                placeholder = { Text(text = username.hint)},
                onValueChange = {
                    viewModel.onEvent(AccountEvent.ChangeUsername(it))
                }
            )
            Spacer(modifier = Modifier.height(20.dp))
            TextField(
                value = password.text,
                placeholder = { Text(text = password.hint)},
                onValueChange = {
                    viewModel.onEvent(AccountEvent.ChangePassword(it))
                }
            )
        }
    }

總結

上述的倆個測例,只是使用Hilt提供的便利的冰山一角;Hilt使用起來很方便,而去可以提高代碼結構,省去不必要的代碼;其中Koin依賴注入庫也備受好評,雖然我沒有使用過,因為Google推Hilt,就首先入手啦;在性能上,我看了一些其他文章上介紹,大差不差的,所有根據自己需要進行選擇。

到此這篇關于Android Hilt依賴注入的使用講解的文章就介紹到這了,更多相關Android Hilt依賴注入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Android中String與int相互轉換

    Android中String與int相互轉換

    大家好,本篇文章主要講的是Android中String與int相互轉換,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Android?WebView緩存機制優(yōu)化加載慢問題

    Android?WebView緩存機制優(yōu)化加載慢問題

    我知道你一定在煩惱Android?Webview的性能問題,特別突出的是-加載速度慢、消耗流量,針對Android?Webview的性能問題,提出一些有效解決方案
    2023-02-02
  • android側滑菜單控件DrawerLayout使用方法詳解

    android側滑菜單控件DrawerLayout使用方法詳解

    這篇文章主要為大家詳細介紹了android側滑菜單控件DrawerLayout的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android?TextView的maxEms和maxLength屬性區(qū)別

    Android?TextView的maxEms和maxLength屬性區(qū)別

    這篇文章主要為大家介紹了Android?TextView的maxEms和maxLength屬性區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Android實現本地Service方法控制音樂播放

    Android實現本地Service方法控制音樂播放

    這篇文章主要為大家詳細介紹了Android實現本地Service方法控制音樂播放,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Android SharePreferences與數據庫SQLite存儲實現方法介紹

    Android SharePreferences與數據庫SQLite存儲實現方法介紹

    這篇文章主要介紹了Android SharePreferences與數據庫SQLite用于存儲的具體實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09
  • Android進程間大數據通信LocalSocket詳解

    Android進程間大數據通信LocalSocket詳解

    這篇文章主要為大家介紹了Android進程間大數據通信LocalSocket詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Android PickerView實現三級聯動效果

    Android PickerView實現三級聯動效果

    這篇文章主要為大家詳細介紹了Android PickerView實現三級聯動效果,PickerView實現全國地址的選擇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Flutter TV Android端開發(fā)技巧詳細教程

    Flutter TV Android端開發(fā)技巧詳細教程

    這篇文章主要為大家介紹了Flutter TV Android端開發(fā)技巧詳細教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Android開發(fā)中requestfocus()無效的原因及解決辦法

    Android開發(fā)中requestfocus()無效的原因及解決辦法

    這篇文章主要介紹了Android開發(fā)中requestfocus()無效的原因及解決辦法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08

最新評論

女性| 六安市| 安平县| 富顺县| 治县。| 怀安县| 垫江县| 福安市| 江源县| 怀安县| 德令哈市| 南漳县| 东山县| 凤山市| 锡林浩特市| 玛曲县| 定西市| 布拖县| 吉木萨尔县| 平顶山市| 内丘县| 崇州市| 乌兰浩特市| 中牟县| 西昌市| 漳平市| 元阳县| 教育| 平遥县| 垣曲县| 沁源县| 元氏县| 灵武市| 冕宁县| 宜都市| 武胜县| 海阳市| 金塔县| 柳河县| 开阳县| 阿城市|