Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

activityViewModel with scoped parameters can't be injected #1825

Open
fleficher opened this issue Mar 20, 2024 · 1 comment
Open

activityViewModel with scoped parameters can't be injected #1825

fleficher opened this issue Mar 20, 2024 · 1 comment

Comments

@fleficher
Copy link

fleficher commented Mar 20, 2024

Describe the bug

When a shared ViewModel that has parameters gets injected in a Fragment, Koin fails to retrieve the instance:

Caused by org.koin.core.error.InstanceCreationException: Could not create instance for '[Factory:'hm.a']'
       at org.koin.core.error.InstanceCreationException.<init>(InstanceCreationException.java:23)
       at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:57)
       at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:38)
       at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.java:109)
       at org.koin.core.scope.Scope.resolveValue(Scope.kt:247)
       at org.koin.core.scope.Scope.resolveInstance(Scope.kt:233)
       at org.koin.core.scope.Scope.get(Scope.kt:212)
       at org.koin.androidx.viewmodel.factory.KoinViewModelFactory.create(KoinViewModelFactory.kt:25)
       at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:184)
       at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:150)
       at org.koin.androidx.viewmodel.GetViewModelKt.resolveViewModel(GetViewModel.kt:43)
       at org.koin.androidx.viewmodel.GetViewModelKt.resolveViewModel$default(GetViewModel.kt:28)
Caused by org.koin.core.error.NoParameterFoundException: Can't get injected parameter #0 from DefinitionParameters[] for type 'xxx'
       at org.koin.core.error.NoParameterFoundException.<init>(NoParameterFoundException.java:23)
       at org.koin.core.parameter.ParametersHolder.elementAt(ParametersHolder.kt:45)
       at org.koin.androidx.viewmodel.parameter.AndroidParametersHolder.access$elementAt$s975513686(AndroidParametersHolder.kt:10)
       at org.koin.androidx.viewmodel.parameter.AndroidParametersHolder$elementAt$1.invoke(AndroidParametersHolder.kt:16)
       at org.koin.androidx.viewmodel.parameter.AndroidParametersHolder.createSavedStateHandleOrElse(AndroidParametersHolder.kt:26)
       at org.koin.androidx.viewmodel.parameter.AndroidParametersHolder.elementAt(AndroidParametersHolder.kt:16)

It seems to happen if the activity is implementing AndroidScopeComponent with activityRetainedScope() scope.

Koin module and version:

  • koin-android:3.5.3
  • koin-core:3.5.3

was working well on 3.5.0

Snippet or Sample project to help reproduce

// VM
class WeatherViewModel(private val id: Anything) : ViewModel()

// inside Koin module
viewModel<WeatherViewModel> { (
    id: Anything
) ->
    WeatherViewModel(id)
}

scope<WeatherActivity> {
    scoped<Anything> {
       Anything()
    }
}

// Activity
class WeatherActivity : AppCompatActivity(), AndroidScopeComponent {
    override val scope: Scope by activityRetainedScope()

    private val anything: Anything by inject()

    private val weatherViewModel by viewModel<WeatherViewModel> {
        parametersOf(anything)
    }

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

        weatherViewModel.run {}
        // attach fragment
    }
}

// Fragment instantiated by the activity
class WeatherListFragment : Fragment() {
    private val weatherViewModel by activityViewModel<WeatherViewModel>()
}
@fleficher fleficher changed the title activityViewModel with parameters can't be injected activityViewModel with scoped parameters can't be injected Mar 20, 2024
@guilhermemagro
Copy link

On Koin 3.5.6 I am getting the same error
Caused by org.koin.core.error.NoParameterFoundException: Can't get injected parameter #0 from DefinitionParameters[] for type 'xxx'
and I am also using an Activity with AndroidScopeComponent but I am not using ViewModel and activityRetainedScope().

I could reproduce de error with this test on the Koin lib:

class ScopeWithParametersTest : AutoCloseKoinTest() {

    interface MyContract {
        interface View
        interface Presenter
    }
    class MyView : AppCompatActivity(), AndroidScopeComponent, MyContract.View {
        override val scope by lazy { getKoin().getScopeOrNull(getScopeId()) ?: getKoin().createScope(getScopeId(), getScopeName(), this) }
        //  It also breaks with activityRetainedScope:
        // override val scope by activityRetainedScope()
    }

    class MyPresenter(private var view: MyContract.View?) : MyContract.Presenter
    interface FacadeContract
    class MyFacade(private var presenter: MyContract.Presenter?) : FacadeContract

    object MyModule {
        val instance = module {
            scope(named<MyView>()) {
                scoped<FacadeContract> {
                    MyFacade(presenter = get())
                }
                scoped<MyContract.Presenter> { (view: MyContract.View) ->
                    MyPresenter(view = view)
                }
            }
        }
    }

    @get:Rule
    val mockProvider = MockProviderRule.create { clazz ->
        mockkClass(clazz)
    }

    @Test
    fun `check koin definitions with success`() {
        startKoin {
            modules(
                MyModule.instance
            )
        }.checkModules()
    }
}

I think the problem is something related to classes with parameters inside scopes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants