一、前言
目前项目中使用JetPack
的越来越多,然后Hilt
也对其进行了一定的支持,其中有ViewModel
和WorkManager
。这里进行简单记录
二、ViewModel
添加依赖:
// implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
//hilt-lifecycle-viewmodel在Dagger 2.34 版本中被弃用
//所以之后的版本不能又这个依赖否则编译出错,
implementation "com.google.dagger:hilt-android:2.41"
kapt "com.google.dagger:hilt-android-compiler:2.41"
// When using Kotlin.
kapt 'androidx.hilt:hilt-compiler:1.0.0'
// When using Java.
annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
将前文的代码修改到ViewModel
中
@HiltViewModel
class HiltViewModel @Inject constructor(): ViewModel() {
// @DatabaseLogger
@Named("local")
@Inject
lateinit var loggerLocal: LoggerDataSource
// @InMemoryLogger
@Named("memory")
@Inject
lateinit var loggerInMemory: LoggerDataSource
@Inject lateinit var dao: LogDao
@Inject
lateinit var dateFormatter: DateFormatter
fun viewModelTest(){
dateFormatter.testDateFormatter()
loggerLocal.type()
loggerInMemory.type()
}
}
@AndroidEntryPoint
class HiltActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_hilt)
val exampleViewModel: HiltViewModel = ViewModelProvider(this).get(HiltViewModel::class.java)
exampleViewModel.viewModelTest()
}
}
如果ViewModel
需要传递参数的话,以下是官方例子:
@HiltViewModel
public class DonutViewModel extends ViewModel {
@Inject
public DonutViewModel(SavedStateHandle handle, RecipeRepository repository) {
// ...
}
}
@AndroidEntryPoint
public class CookingActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
DonutViewModel vm = new ViewModelProvider(this).get(DonutViewModel.class);
}
}
这个例子的具体代码在drgger官网有详细例子:
https://dagger.dev/hilt/view-model
三、WorkManager
添加依赖
implementation "com.google.dagger:hilt-android:2.41"
implementation 'androidx.hilt:hilt-work:1.0.0'
kapt "com.google.dagger:hilt-android-compiler:2.41"
kapt 'androidx.hilt:hilt-compiler:1.0.0'
import androidx.hilt.work.HiltWorkerFactory
import androidx.work.Configuration
import androidx.work.WorkerParameters
import dagger.hilt.android.HiltAndroidApp
import javax.inject.Inject
@HiltAndroidApp
class App: Application(), Configuration.Provider{
@Inject
lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
}
import androidx.work.Worker
import androidx.work.WorkerParameters
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
class ExampleWorker @AssistedInject constructor(
// @Assisted("context") appContext: Context,
// @Assisted("parame") workerParams: WorkerParameters,
@Assisted appContext: Context,
@Assisted workerParams: WorkerParameters,
// workerDependency: WorkerDependency
) : Worker(appContext, workerParams) {
override fun doWork(): Result {
Log.e("YM","---->执行下Work任务")
return Result.success()
}
}
@AndroidEntryPoint
class HiltActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_hilt)
val exampleViewModel: HiltViewModel = ViewModelProvider(this).get(HiltViewModel::class.java)
exampleViewModel.viewModelTest()
WorkManager.getInstance(this).enqueue(OneTimeWorkRequest.from(ExampleWorker::class.java))
}
}
版本更新比较快,跟官方网站和其他人的帖子不太一样。上面注释的@Assisted("parame")
也是可以使用的,如果在使用@Assisted
被告诉只能使用一个参数时候,可以使用这种方式进行区分,其中在AndroidManifest.xml
中初始化WorkManager
并不需要这一步,因为这是按需初始化WorkManager
。如果不写的话,默认在程序启动时候出时候,具体查看官方文档对WorkManager
初始化的一节
四、参考链接
- ComponentProcessingStep 无法处理 ‘*Application_HiltComponents.SingletonC’
- [Hilt 和 Jetpack 集成](https://developer.android.google.cn/training/dependency-injection/hilt-jetpack0
- Hilt View Models