android 如何在MVVM中传递Repository中的上下文,而不使用DI并遵循干净的架构?

toiithl6  于 2023-01-15  发布在  Android
关注(0)|答案(2)|浏览(230)

我需要在存储库中初始化Room,但要做到这一点,我需要上下文。如果我通过视图模型传递上下文,我会得到以下消息This field leaks a context object
我已经检查了this的答案,但是他们在视图层中初始化了存储库对象,但是根据干净的体系结构,视图层不应该知道任何关于数据层的信息,对吗?那么如何组织context到数据层的交付,而不使用DI呢?

class MainViewModel(private val context: Context) : ViewModel() {

private val roomManager : RoomManager = RoomManagerImpl(context)

private fun addItem(){
    roomManager.addItem()
}

}
以下是存储库代码

class RoomManagerImpl(private val context: Context) : RoomManager {
private val db = Room.databaseBuilder(
    context,
    AppDatabase::class.java, "database-name"
)
elcex8rz

elcex8rz1#

将Activity Context传递给Activity的ViewModel并不是一个好的做法,它会导致内存泄漏。
您可以通过扩展以下代码中的AndroidViewModel类检查来获取ViewModel中的上下文。
它将为您提供应用程序级别的上下文。

class MainViewModel(application: Application) : AndroidViewModel(application) {

    private val context = getApplication<Application>().applicationContext
    private val roomManager: RoomManager = RoomManagerImpl(context)

    fun addItem() {
        roomManager.addItem()
    }
}
8ehkhllq

8ehkhllq2#

class MainViewModal(val repository:roomManager) :ViewModel() {
            
            fun testFunction(context: Context){
            roomManager.testMethod(context)   //text method is your repository method
        }
    }

我是这样说的,我希望它能帮助你,否则你可以使用AndroidViewModel而不是Viewmodal

相关问题