欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android Hilt依賴(lài)注入的使用講解

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

什么是依賴(lài)注入

首先,某個(gè)類(lèi)的成員變量稱(chēng)為依賴(lài),如若此變量想要實(shí)例化引用其類(lèi)的方法,可以通過(guò)構(gòu)造函數(shù)傳參或者通過(guò)某個(gè)方法獲取對(duì)象,此等通過(guò)外部方法獲取對(duì)象實(shí)例的稱(chēng)為依賴(lài)注入;而依賴(lài)注入又可以簡(jiǎn)單分為手動(dòng)注入和自動(dòng)注入兩種方式;Hilt就是基于Dagger進(jìn)行場(chǎng)景化優(yōu)化的一個(gè)依賴(lài)注入庫(kù),Hilt是Google專(zhuān)門(mén)為Android平臺(tái)打造的一個(gè)依賴(lài)注入庫(kù),在使用上極大程度進(jìn)行啦簡(jiǎn)化(與dagger相比)

使用依賴(lài)注入的好處

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

  • 重用代碼
  • 易于重構(gòu)
  • 易于測(cè)試

簡(jiǎn)單來(lái)說(shuō),在開(kāi)發(fā)中某些內(nèi)容需要進(jìn)行層層手動(dòng)調(diào)用,而且需要手動(dòng)進(jìn)行實(shí)例化;對(duì)于Hilt而言,它可以自動(dòng)進(jìn)行依賴(lài)注入,并且為項(xiàng)目中的每個(gè) Android 類(lèi)提供容器并自動(dòng)管理其生命周期;某些需要全局使用的數(shù)據(jù),可以通過(guò)Hilt進(jìn)行共享,從而簡(jiǎn)化代碼

Hilt中常用的預(yù)定義限定符

@HiltAndroidApp

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

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

@AndroidEntryPoint

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

目前Hilt 支持以下 Android 類(lèi):

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

@Module

Hilt帶有一個(gè)模塊的類(lèi),使用@Module注解的類(lèi),它會(huì)告知Hilt,它提供了哪些實(shí)例,通常和@Provider搭配使用,必須通過(guò)@InstallIn注解為其添加作用域

@InstallIn

對(duì)于您可以從中執(zhí)行字段注入的每個(gè) Android 類(lèi),都有一個(gè)關(guān)聯(lián)的 Hilt 組件,您可以在 @InstallIn 注解中引用該組件。每個(gè) Hilt 組件負(fù)責(zé)將其綁定注入相應(yīng)的 Android 類(lèi)。

Android 組件默認(rèn)綁定
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知道,提供了哪些實(shí)例對(duì)象,可以使用@Provides進(jìn)行注解,以下提供啦一個(gè)數(shù)據(jù)庫(kù)實(shí)例,并且作用域是全局單例

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

@Inject

如果想要使用Hilt自動(dòng)進(jìn)行啦依賴(lài)注入的對(duì)象,可以使用@Inject注解進(jìn)行調(diào)用;如下,無(wú)需進(jìn)行實(shí)例化,它會(huì)自動(dòng)引用providerAccountBean()提供的對(duì)象

@Inject lateinit var bean: AccountBean

@HiltViewModel

通過(guò)名稱(chēng)就可以了解,它需要與ViewModel類(lèi)聯(lián)合使用,作用于ViewModel上;如下,與@Inject結(jié)合使用,在構(gòu)造函數(shù)引用啦上述Hilt提供的對(duì)象

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

Hilt的使用

依賴(lài)

第一步:在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
    }
}

建立實(shí)體類(lèi)

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

添加Hilt入口

@HiltAndroidApp
class APP:Application() {}

提供對(duì)象

此處作為用例,只是簡(jiǎn)單寫(xiě)一個(gè)測(cè)試用例,在函數(shù)中可以編寫(xiě)復(fù)雜的程序,并不會(huì)影響程序性能,在程序初始化編譯時(shí)會(huì)耗時(shí)一丟丟。一下提供啦單例AccountBean對(duì)象

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

獲取對(duì)象

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

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

然后就可以直接進(jìn)行對(duì)象引用

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

應(yīng)用與ViewModel中

在ViewModel中使用HiltViewModel注解,然后就可以使用Inject注解獲取Hilt自動(dòng)注入依賴(lài)的對(duì)象

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

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

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初始化函數(shù)中,將Hilt提供的對(duì)象的值賦值給VM中的兩個(gè)狀態(tài)變量

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

通過(guò)外部事件進(jìn)行對(duì)應(yīng)處理,外部輸入框不斷進(jìn)行值修改,此處同步給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的兩個(gè)成員變量值,然后與兩個(gè)輸入框進(jìn)行綁定,通過(guò)監(jiān)聽(tīng)輸入框的onValueChange方法,當(dāng)其值不斷修改時(shí),然后調(diào)用VM中的onEvent方法,然后修改VM中的狀態(tài)內(nèi)容,由于輸入框綁定了VM的狀態(tài)變量,然后狀態(tài)變量值改變后,相對(duì)應(yīng)的UI界面會(huì)進(jìn)行重組

    @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))
                }
            )
        }
    }

總結(jié)

上述的倆個(gè)測(cè)例,只是使用Hilt提供的便利的冰山一角;Hilt使用起來(lái)很方便,而去可以提高代碼結(jié)構(gòu),省去不必要的代碼;其中Koin依賴(lài)注入庫(kù)也備受好評(píng),雖然我沒(méi)有使用過(guò),因?yàn)镚oogle推Hilt,就首先入手啦;在性能上,我看了一些其他文章上介紹,大差不差的,所有根據(jù)自己需要進(jìn)行選擇。

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

相關(guān)文章

最新評(píng)論