App Crash однажды заменил Fragment для области видимости модели - PullRequest
0 голосов
/ 21 июня 2019

ошибка

У меня возникла проблема при попытке открыть фрагмент, а затем заменить на тот же фрагмент. В нашем приложении Prod это популярный случай.

java.lang.IllegalStateException: Definition without any InstanceContext - [type:Scope,scope:'com.abc.view.fragment.BrowseTaskFragment', primary_type:'com.abc.viewModel.BrowseTaskVM']
        at org.koin.core.definition.BeanDefinition.resolveInstance(BeanDefinition.kt:72)
        at org.koin.core.scope.Scope.resolveInstance(Scope.kt:141)
        at org.koin.core.scope.Scope.get(Scope.kt:131)
        at com.abc.view.fragment.BrowseTaskFragment$$special$$inlined$inject$1.invoke(Scope.kt:274)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at com.abc.view.fragment.BrowseTaskFragment.getMViewModel(Unknown Source:25)
        at com.abc.view.fragment.BrowseTaskFragment.getMViewModel(BrowseTaskFragment.kt:37)
        at com.abc.base.BaseFragment.performViewModelBinding(BaseFragment.kt:55)
        at com.abc.base.BaseFragment.onViewCreated(BaseFragment.kt:31)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6810)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

Шаги для воспроизведения поведения:

  • У меня есть BottomNavigationView, как только я нажимаю на существующий фрагмент, который виден, получая выше сбоя.

Версия Koin: 2.0.1

Модуль

val viewModelModule = module {
     scope(named<BrowseTaskFragment>()) {
        scoped { BrowseTaskVM() }
      }
    }

Класс применения

startKoin {
            androidContext(this@AbcApplication)
            modules(listOf(appModule, stateModule, apiModule, viewModelModule))
        }

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Вы можете сделать это, создав область действия.Сначала в вашем модуле создайте область видимости по имени метода koin

val viewModelModule = module {
 scope(named("BrowseTaskFragment")) {
   viewModel{ BrowseTaskVM() }
  }
}

Второй в вашем фрагменте

private val viewModelScope = getKoin().getOrCreateScope("Scope1",named("BrowseTaskFragment"))
private val browseTaskVM: BrowseTaskVM= viewModelScope.get()

Последний в методе onDestoyзакройте сферу.

 override fun onDestroy() {
    super.onDestroy()
    viewModelScope.close()
}
0 голосов
/ 21 июня 2019

определить в классе приложения, как это

  startKoin {
           androidContext(this@ApplicationContext)
        // your modules
        modules(listOf(your modules))
    }

и передать контекст в ваших модулях

...