【筆記】Dagger 和 Hilt 介紹… (By ChatGPT)

Dagger 和 Hilt 都是用於在 Android 應用程式中進行依賴注入的庫。它們都提供了一種機制,用於解決 Android 應用程式中的複雜依賴關係,並使代碼更易於測試和維護。

Dagger 是由 Google 開發的一種依賴注入框架,它使用 Java 注釋處理器和反射來分析代碼,並在應用程式的運行時期動態生成依賴關係。Dagger 2 是 Dagger 的最新版本,它使用了更先進的技術來提高性能和可維護性。

Hilt 是基於 Dagger 的一種依賴注入庫,它簡化了 Dagger 的配置和使用,並提供了更好的支援。Hilt 通過使用注釋和代碼生成來自動化依賴注入的過程,從而降低了使用 Dagger 的門檻,並使代碼更易於閱讀和維護。Hilt 還提供了與 Android 中的其他元件(如 Activity、Fragment、ViewModel 等)的集成,從而使依賴注入變得更加簡單。

總的來說,Dagger 和 Hilt 都是非常強大的依賴注入框架,它們都有自己的優點和適用場景。如果您需要更高級的功能並且願意投入更多的學習成本,那麼 Dagger 可能更適合您。如果您需要更快速的入門和更易於使用的框架,則 Hilt 可能更適合您。


以下是一個使用 Hilt 和 Jetpack Compose 的簡單示例:

首先,在您的 build.gradle 檔中添加以下依賴項:

dependencies {
    // Jetpack Compose
    implementation "androidx.compose.ui:ui:1.1.0"
    implementation "androidx.compose.material:material:1.1.0"
    implementation "androidx.compose.runtime:runtime-livedata:1.1.0"
    implementation "androidx.activity:activity-compose:1.3.1"

    // Hilt
    implementation "com.google.dagger:hilt-android:2.39.1"
    kapt "com.google.dagger:hilt-android-compiler:2.39.1"
    implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
    kapt "androidx.hilt:hilt-compiler:1.0.0"
}

然後,創建一個簡單的資料類 User

data class User(val name: String, val age: Int)

接下來,在您的應用程式類上添加 @HiltAndroidApp 注釋:

@HiltAndroidApp
class MyApplication : Application()

然後,創建一個 ViewModel,用於管理使用者資料:

@HiltViewModel
class MyViewModel @Inject constructor() : ViewModel() {
    private val _user = MutableLiveData<User>()
    val user: LiveData<User> = _user

    init {
        _user.value = User("Tom", 30)
    }

    fun updateUser(name: String, age: Int) {
        _user.value = User(name, age)
    }
}

在此示例中,我們使用了 @HiltViewModel 注釋來標記 ViewModel 類,以便 Hilt 可以為其提供依賴項。我們還在 init 塊中設置了預設使用者資料,並提供了一個 updateUser() 方法,以便我們可以更新使用者資料。

接下來,創建一個 Composable 函數 MyScreen,用於顯示使用者資料和更新使用者資料:

@Composable
fun MyScreen(viewModel: MyViewModel = viewModel()) {
    val user by viewModel.user.observeAsState()
    val scaffoldState = rememberScaffoldState()

    Scaffold(
        scaffoldState = scaffoldState,
        topBar = {
            TopAppBar(title = { Text("My App") })
        },
        content = {
            Column(
                modifier = Modifier.padding(16.dp),
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Text(text = "Name: ${user?.name ?: ""}")
                Spacer(modifier = Modifier.height(16.dp))
                Text(text = "Age: ${user?.age ?: ""}")
                Spacer(modifier = Modifier.height(16.dp))
                OutlinedTextField(
                    value = user?.name ?: "",
                    onValueChange = { newName ->
                        viewModel.updateUser(newName, user?.age ?: 0)
                    },
                    label = { Text("Name") },
                )
                Spacer(modifier = Modifier.height(16.dp))
                OutlinedTextField(
                    value = user?.age?.toString() ?: "",
                    onValueChange = { newAge ->
                        viewModel.updateUser(user?.name ?: "", newAge.toIntOrNull() ?: 0)
                    },
                    label = { Text("Age") },
                    keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
                )
            }
        }
    )
}

在上面的 Composable 函數中,我們使用了 viewModel() 方法來獲取 MyViewModel 的實例,並使用 observeAsState() 方法來觀察 user 資料並將其存儲在 user 變數中。這使得當 user 資料發生更改時,介面可以自動更新。

我們還創建了一個 Scaffold,其中包含一個 TopAppBar 和一個 Column,用於顯示使用者資料和允許使用者更新其姓名和年齡。我們使用 OutlinedTextField 來接收用戶輸入,並使用 viewModel.updateUser() 方法將更新後的資料傳遞給 MyViewModel

最後,我們可以在 MainActivity 中使用 MyScreen Composable 函數來顯示使用者資料和更新介面:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyApplicationTheme {
                MyScreen()
            }
        }
    }
}

在此示例中,我們使用了 MyApplicationTheme 來為應用程式添加主題,並將 MyScreen 添加為應用程式的內容。現在,當我們運行應用程式時,我們應該能夠看到一個包含使用者資料和允許更新資料的介面。


留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *