Hilt的使用(JetPack的兼容)五

一、前言

目前项目中使用JetPack的越来越多,然后Hilt也对其进行了一定的支持,其中有ViewModelWorkManager。这里进行简单记录

二、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初始化的一节

四、参考链接

  1. ComponentProcessingStep 无法处理 ‘*Application_HiltComponents.SingletonC’
  2. [Hilt 和 Jetpack 集成](https://developer.android.google.cn/training/dependency-injection/hilt-jetpack0
  3. Hilt View Models
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您使用的是 Hilt 2.28及以上版本,则可以不需要在 AndroidManifest.xml 文件中的 Application 标签添加 AndroidEntryPoint 注解,而是在 HiltApplication 中添加 @HiltAndroidApp 注解即可。 至于如何在代码中使用 Hilt 进行依赖注入,您可以使用 @Inject 注解来标记需要注入的依赖,同时在需要使用该依赖的地方使用 @Inject 注解进行注入。此外,您还可以通过 @Module 和 @Provides 注解来自定义依赖的注入行为。 例如,以下是一个使用 Hilt 进行依赖注入的示例代码: ```java @AndroidEntryPoint public class MyActivity extends AppCompatActivity { @Inject MyDependency myDependency; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 使用注入的依赖 myDependency.doSomething(); } } @Module @InstallIn(ActivityComponent.class) public class MyModule { @Provides MyDependency provideMyDependency() { return new MyDependencyImpl(); } } ``` 在上述代码中,我们使用 @AndroidEntryPoint 标注了 MyActivity,表示该 Activity 会使用 Hilt 进行依赖注入。通过 @Inject 注解标记了 MyDependency 字段,表示需要注入 MyDependency 类型的依赖。在 MyModule 中使用 @Provides 注解提供了 MyDependency 的实例。在 MyActivity 中,我们直接使用注入的 MyDependency 实例来调用其方法。 需要注意的是,上述代码是基于 Hilt 2.28及以上版本进行的示例。如果您使用的是旧版本的 Hilt,可能需要做出一些调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值