如何使用 koin 在 vi​​ewmodel 中注入 Room

How to inject Room in viewmodel using koin

这是我使用 koin 的第一个 mvvm 项目,我使用的是 Room 数据库。我在 viemwodel 中进行网络调用,从 api 获取数据后,我想将其存储在数据库中。下面是我的 class,它具有所有数据库方法,如插入和删除。

class UserViewModel(application: Application) : AndroidViewModel(application) {
   
    private val userSDAO: UserDAO
    private val userDB: AppSettingsDatabase

    init {
        userDB = AppSettingsDatabase.getAppSettingsDatabase(application.applicationContext)!!
        userDAO = userDB.userDao()
    }

    fun getAppSetting():LiveData<AppSettingsEntity>{
        return userDB.appSettingDao().getAllAppSettings()
    }

    fun deleteUser() {
        userDB.databaseWriteExecutor.execute { ->
            userDAO.deleteUser()
        }
    }
}

我在 activity 中这样调用 class

userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)

现在我想在我进行网络 api 调用的视图模型 class 中调用它,但我不知道使用 koin 或任何方法访问它的最佳方法是什么其他 way.I 有不同的方法,我需要访问数据库,我必须在每个方法中像上面那样初始化它。

class SubscriptionViewModel(): BaseViewModel() {

    fun init(owner:ViewModelStoreOwner) { 
        userServiceViewModel = ViewModelProvider(owner).get(UserServiceViewModel::class.java)
    } 
}

一般来说,在 ViewModel 中不访问 db 对象是更好的模式。我的意思是 dao 应该在数据源 class 中使用,然后数据源将被注入 ViewModel 甚至更好,在存储库中使用数据源,然后将存储库注入 ViewModel =10=].

之后,您不得访问另一个内的 ViewModel。他们应该是独立的。如果您想在多个 ViewModel 中对数据库或 api 执行某些操作,请通过公共存储库访问它们 class.

请看:https://developer.android.com/jetpack/guide#overview