我试图将一组房间组件注入存储库,存储库本身使用Dagger2注入ViewModel(在片段中)。
代码如下。
片段:
class MyFragment : Fragment() {
private var viewModel: MyViewModel? = null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
viewModel!!.init()
viewModel!!.getUser().observe(this, Observer<MyClass?> {...})
}
...
}
视图模型:
class MyViewModel : ViewModel() {
@Inject lateinit var myRepo: MyRepository
private var instance: LiveData<MyClass>? = null
fun init() {
DaggerAppComponent.builder()
.build().daggerInject(this)
if (this.instance != null) {
return
}
instance = myRepo.getInstance()
}
}
我的存储库:
@Singleton
class MyRepository {
@Inject lateinit var myDao: MyDao
@Inject lateinit var executor: Executor
init {
DaggerAppComponent.builder().build().daggerInject(this)
}
}
最后,对于我的匕首类,我有两个模块:
@Module(includes = [AndroidInjectionModule::class])
abstract class AppModule {
@Binds
abstract fun application(app: MyApplication): MyApplication
}
@Module
class DataModule {
@Inject
lateinit var application: MyApplication
val myDatabase = Room.databaseBuilder(application, MyDatabase::class.java, "my-database").build()
@Provides
@Singleton
fun provideRepository(): MyRepository {
return MyRepository()
}
@Provides
fun provideMyDao(): MyDao {
return MyDao_Impl(myDatabase)
}
@Provides
fun providesExecutor(): Executor {
return Executors.newSingleThreadExecutor()
}
}
和我的AppComponent:
@Singleton
@Component(modules = [AppModule::class, DataModule::class])
interface AppComponent : AndroidInjector<MyApplication> {
fun daggerInject(viewModel: MyViewModel)
fun daggerInject(myRepo: MyRepository)
@Component.Builder
abstract class Builder: AndroidInjector.Builder<MyApplication>()
}
Dagger编译正常,我可以访问DaggerAppComponent
并构建它。但是dataModule
是不可访问的(检查类将其显示为私有),我需要实际注入依赖项的daggerInject
方法也是如此。结果我得到错误:
未解析的参考:daggerInject
我该如何解决这个问题?
inline fun <reified T: ViewModel> AppCompatActivity.createViewModel(crossinline factory: () -> T): T = T::class.java.let { clazz ->
ViewModelProviders.of(this, object: ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if(modelClass == clazz) {
@Suppress("UNCHECKED_CAST")
return factory() as T
}
throw IllegalArgumentException("Unexpected argument: $modelClass")
}
}).get(clazz)
}
inline fun <reified T: ViewModel> Fragment.createViewModel(crossinline factory: () -> T): T = T::class.java.let { clazz ->
ViewModelProviders.of(this, object: ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if(modelClass == clazz) {
@Suppress("UNCHECKED_CAST")
return factory() as T
}
throw IllegalArgumentException("Unexpected argument: $modelClass")
}
}).get(clazz)
}
和片段:
class MyFragment : Fragment(), Injectable {
private lateinit var viewModel: MyViewModel
@Inject lateinit var appComponent: AppComponent
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = createViewModel { appComponent.myViewModel() }
viewModel.getUser().observe(this) {...}
}
...
}
视图模型:
class MyViewModel @Inject constructor(private val myRepo: MyRepository): ViewModel() {
private var instance: LiveData<MyClass>? = myRepo.getInstance()
}
我的存储库:
@Singleton
class MyRepository @Inject constructor(
private val myDao: MyDao,
private val executor: Executor
) {
}
最后,对于我的匕首类,我有两个模块:
@Module(includes = [AndroidInjectionModule::class])
abstract class AppModule {
fun application(myApplication: MyApplication): Application = myApplication
}
@Module
abstract class DataModule {
@Provides
fun myDatabase(application: Application) =
Room.databaseBuilder(application, MyDatabase::class.java, "my-database").build()
@Provides
fun myDao(): MyDao = myDatabase.myDao()
@Provides
fun providesExecutor(): Executor =
Executors.newSingleThreadExecutor()
}
和我的AppComponent:
@Singleton
@Component(modules = [AppModule::class, DataModule::class])
interface AppComponent : AndroidInjector<MyApplication> {
@Component.Builder
abstract class Builder: AndroidInjector.Builder<MyApplication>()
fun myViewModel(): MyViewModel
}
和AppInjector:
import android.app.Activity
import android.app.Application
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentActivity
import android.support.v4.app.FragmentManager
import dagger.android.AndroidInjection
import dagger.android.support.AndroidSupportInjection
import dagger.android.support.HasSupportFragmentInjector
/**
* Helper class to automatically inject fragments if they implement [Injectable].
*/
object AppInjector {
fun init(myApp: MyApplication) {
DaggerAppComponent.builder().application(myApp)
.build().inject(myApp)
myApp
.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
handleActivity(activity)
}
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
}
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityStopped(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) {
}
override fun onActivityDestroyed(activity: Activity) {
}
})
}
private fun handleActivity(activity: Activity) {
if (activity is HasSupportFragmentInjector) {
AndroidInjection.inject(activity)
}
if (activity is FragmentActivity) {
activity.supportFragmentManager
.registerFragmentLifecycleCallbacks(
object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentCreated(
fm: FragmentManager,
f: Fragment,
savedInstanceState: Bundle?
) {
if (f is Injectable) {
AndroidSupportInjection.inject(f)
}
}
}, true
)
}
}
}
和
class MyApplication : Application(), HasActivityInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
override fun onCreate() {
super.onCreate()
AppInjector.init(this)
}
override fun activityInjector() = dispatchingAndroidInjector
}
Quarkus native and org.kohsuke:github-api-解析过程中未解析的方法-注释的方法 这是Quarkus native and org.kohsuke的后续:github-api-未能反序列化异常问题,我正在使用https://github.com/quarkusio/Quarkus/pull/9182修补程序来克服register for reflection挑
7.4.6. 方法注入 在多数程序应用场景下,容器中的bean大部分都是单例的。当一个单例bean需要与另一个单例bean协作,或者一个非单例bean需要与另一个非单例bean协作时,通常通过将一个bean定义为另一个bean的属性您就可以处理这种依赖。问题出现在bean的生命周期不同时。假设单例bean A需要使用原型bean(非单例的)B,可能调用A上的每个方法都会用到B。容器只会创建单例be
本文向大家介绍php防止sql注入的方法详解,包括了php防止sql注入的方法详解的使用技巧和注意事项,需要的朋友参考一下 一、什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQ
本文向大家介绍Spring @value和@PropertySource注解使用方法解析,包括了Spring @value和@PropertySource注解使用方法解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring @value和@PropertySource注解使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考
本文向大家介绍深入解析python中的实例方法、类方法和静态方法,包括了深入解析python中的实例方法、类方法和静态方法的使用技巧和注意事项,需要的朋友参考一下 1、实例方法/对象方法 实例方法或者叫对象方法,指的是我们在类中定义的普通方法。 只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一定是对象本身 2、静态方法 (1).格式:在方法上面添加 @staticmethod (2)
本文向大家介绍springboot注入servlet的方法,包括了springboot注入servlet的方法的使用技巧和注意事项,需要的朋友参考一下 问:有了springMVC,为什么还要用servlet?有了servlet3的注解,为什么还要使用ServletRegistrationBean注入的方式? 使用场景:在有些场景下,比如我们要使用hystrix-dashboard,这时候就需要注入