之前和现在使用
之前
buildscript {
...
dependencies {
...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}
}
...
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
android {
...
}
dependencies {
implementation "com.google.dagger:hilt-android:2.28-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
}
现在 用到了
plugins {
id 'com.android.application' version '7.1.3' apply false
id 'com.android.library' version '7.1.3' apply false
id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
// 新的
id 'com.google.dagger.hilt.android' version '2.41' apply false
}
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-android-extensions'
id 'dagger.hilt.android.plugin'
id 'kotlin-kapt'
}
这样直接写 就会找不到 dagger.hilt.android.plugin 我看了半天就不知道为啥,就显示注释掉。
···
The Hilt Android Gradle plugin is applied but no com.google.dagger:hilt-android dependency was found.
···
写上
/*hide*/
implementation "com.google.dagger:hilt-android:2.38.1"
kapt "com.google.dagger:hilt-android-compiler:2.38.1"
implementation "androidx.activity:activity-ktx:1.4.0"
implementation 'androidx.fragment:fragment-ktx:1.4.0'
之后在Sync Now,就安然无恙了。
demo 部分。正常的viewmodel 部分使用
一个多余的代码都没有了
@HiltAndroidApp
class App : Application() {
}
首页中
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewmodel: UserViewmodel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
hello.text = viewmodel.text.value
}
}
@HiltViewModel
class UserViewmodel @Inject constructor(
private val userRepository: UserRepository
) : ViewModel() {
private val _text = MutableLiveData()
val text: LiveData = _text
init {
loadCrypto()
}
private fun loadCrypto() {
_text.value = userRepository.getHelloText()
}
}
interface UserRepository {
fun getHelloText(): String?
}
具体实现
class UserImpl : UserRepository {
override fun getHelloText(): String? {
return "hello hilt";
}
}
绑定数据
@Module
@InstallIn(SingletonComponent::class)
class AppModule {
@Provides
@Singleton
fun provideuserRepository(): UserRepository = UserImpl()
}
核心就是
和官网的想法一样。
但为啥代码不一样
这样去掉 viewmodel 使用
@Module
@InstallIn(ActivityComponent::class)
public interface UserEngine {
@Binds
fun bindUserService(userImpl: UserImpl): UserRepository
}
import javax.inject.Inject
class UserImpl @Inject constructor() : UserRepository {
override fun getHelloText(): String {
return "hello hilt"
}
}
修改了一下 @Inject constructor() 添加了这个。
同样的mainactivity 中使用
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
// private val viewmodel: UserViewmodel by viewModels()
@Inject
@JvmField
var userRepository: UserRepository? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// hello.text = viewmodel.text.value
hello.text = userRepository?.getHelloText()
}
}
就简单多了。
官网上有一个可以多个 绑定的
也是同样的道理可以做的
慢慢的官方的文档看到还有点味道了。反而觉得
最后感谢
https://developer.android.google.cn/training/dependency-injection/hilt-android#inject-provides
https://blog.csdn.net/Android_data/article/details/120638365