【问题标题】:How to inject Room in viewmodel using koin如何使用 koin 在视图模型中注入 Room
【发布时间】:2020-11-17 11:07:51
【问题描述】:

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

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()
        }
    }
}

我从这样的活动中调用这个类

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

现在我想在我正在调用网络 api 的 viewmodel 类中调用它,但我不知道使用 koin 或任何其他方式访问它的最佳方法是什么。我需要不同的方法数据库访问,我必须在每个方法中像上面一样初始化它。

class SubscriptionViewModel(): BaseViewModel() {

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

【问题讨论】:

    标签: android kotlin mvvm android-room koin


    【解决方案1】:

    一般来说,最好不要访问ViewModel 中的数据库对象。我的意思是应该在数据源类中使用dao,然后将数据源注入ViewModel,甚至更好,使用存储库中的数据源,然后将存储库注入ViewModel

    之后,您不得在另一个内部访问ViewModel。他们应该是独立的。如果您想对多个ViewModels 中的db 或api 进行操作,请通过公共存储库类访问它们。

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

    【讨论】:

    • 这条评论仍然没有回答如何将实际的 db 对象注入到存储库中的问题
    猜你喜欢
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多