Получите тот же экземпляр ViewModel во Fragment, который определен в Activity с параметром - PullRequest
1 голос
/ 14 февраля 2020

Итак, я использую Koin для внедрения зависимости. Вот что я сделал внутри действия

class ModuleDetailActivity : AppCompatActivity() {

    private lateinit var moduleId:String
    private lateinit var levelModule:Level.Module

    private val moduleViewModel: ModuleViewModel by viewModel { parameterOf(moduleId, levelModule) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        ...
        ...

        moduleId = intent.getString("module_id")
        levelModule = intent.getParcelable("level_module")

        ...
        ...
    }
}

Теперь у меня есть несколько фрагментов, которые ModuleDetailActivity можно добавить или заменить, и я хочу тот же экземпляр moduleViewModel в этих фрагментах без передачи каких-либо параметров внутри Fragment.

class ModuleDetailFragment : Fragment() {

    private val moduleViewModel: ModuleViewModel by sharedViewModel()

    ...
    ...
}

Я знаю, что это вызовет ошибку, и, как и ожидалось, вы можете увидеть это

Caused by: org.koin.core.error.InstanceCreationException: Could not create instance for [Factory:'****.ui.module.ModuleViewModel']

Вот как я инициализировал модуль

val viewModelModule = module {
    viewModel { (id : String, levelModule:Level.Module) -> ModuleViewModel(id, levelModule, get()) }
}

Есть ли какое-либо решение о том, как можно получить один и тот же экземпляр ModuleViewModel, определенный внутри действия, без передачи параметра внутрь Fragment?

1 Ответ

0 голосов
/ 14 февраля 2020

Вы должны инициализировать viewModel, как показано ниже:

class ModuleDetailActivity : AppCompatActivity() {

    private val moduleId: String by lazy {
        intent.getString("module_id")
    }

    private val levelModule: Level.Module by lazy {
        intent.getParcelable("level_module")
    }

    private val moduleViewModel: ModuleViewModel by viewModel {
        parameterOf(moduleId, levelModule)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        ...
        ...

        viewModel.doYourStuff()

        ...
        ...
    }
}

Мы должны использовать get() или inject() только для простых Java объектов. Чтобы ввести ViewModel, они предусмотрели отдельный способ как viewModel()

Не уверен, почему это не работает для вас.

...