3

我有一个用于活动的共享视图模型,它是片段。

从活动实例化时,我的视图模型需要传递的参数(onCreate仅一次)

viewModel =ViewModelProviders.of(this,
                                 NoteViewModelFactory(application!!,
                                                      uid = intent!!.getStringExtra("uid")!!))
                             .get(NoteViewModel::class.java)

但是从片段中我不需要传递参数,因为我确信我已经传递了一次参数。

viewModel = ViewModelProviders.of(activity!!).get(NoteViewModel::class.java)

Koin我尝试在下面做。

val noteModule = module(override = true) {
    viewModel { (id: String) -> NoteViewModel(androidApplication(), id) }
}

在活动中:

private val viewModel: NoteViewModel by viewModel { parametersOf(intent!!.getStringExtra("uid")!!) }

在片段中:

private val viewModel: NoteViewModel by sharedViewModel()

应用程序因以下错误而崩溃:

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.andor.navigate.notepad/com.andor.navigate.notepad.listing.NotesActivity}:org.koin.core.error.InstanceCreationException:无法为 [类型创建实例:Factory,primary_type:'com.andor.navigate.notepad.core.NoteViewModel'] 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os。 Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang。reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)作者:org.koin.core.error.InstanceCreationException:无法在 org.koin.core.instance.DefinitionInstance.create 为 [type:Factory,primary_type:'com.andor.navigate.notepad.core.NoteViewModel'] 创建实例(DefinitionInstance.kt:61) 在 org.koin.core.instance.FactoryDe​​finitionInstance.get(FactoryDe​​finitionInstance.kt:37) 在 org.koin.core.definition.BeanDefinition.resolveInstance(BeanDefinition.kt:70) 在 org.koin。 core.scope.Scope.resolveInstance(Scope.kt:165)886)在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 引起:org.koin.core.error.InstanceCreationException:无法为 [type:Factory,primary_type:'com.andor 创建实例.navigate.notepad.core.NoteViewModel'] 在 org.koin.core.instance.DefinitionInstance.create(DefinitionInstance.kt:61) 在 org.koin.core.instance.FactoryDe​​finitionInstance.get(FactoryDe​​finitionInstance.kt:37) 在 org .koin.core.definition.BeanDefinition.resolveInstance(BeanDefinition.kt:70) at org.koin.core.scope.Scope.resolveInstance(Scope.kt:165)886)在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 引起:org.koin.core.error.InstanceCreationException:无法为 [type:Factory,primary_type:'com.andor 创建实例.navigate.notepad.core.NoteViewModel'] 在 org.koin.core.instance.DefinitionInstance.create(DefinitionInstance.kt:61) 在 org.koin.core.instance.FactoryDe​​finitionInstance.get(FactoryDe​​finitionInstance.kt:37) 在 org .koin.core.definition.BeanDefinition.resolveInstance(BeanDefinition.kt:70) at org.koin.core.scope.Scope.resolveInstance(Scope.kt:165)] 在 org.koin.core.instance.DefinitionInstance.create(DefinitionInstance.kt:61) 在 org.koin.core.instance.FactoryDe​​finitionInstance.get(FactoryDe​​finitionInstance.kt:37) 在 org.koin.core.definition.BeanDefinition。 resolveInstance(BeanDefinition.kt:70) 在 org.koin.core.scope.Scope.resolveInstance(Scope.kt:165)] 在 org.koin.core.instance.DefinitionInstance.create(DefinitionInstance.kt:61) 在 org.koin.core.instance.FactoryDe​​finitionInstance.get(FactoryDe​​finitionInstance.kt:37) 在 org.koin.core.definition.BeanDefinition。 resolveInstance(BeanDefinition.kt:70) 在 org.koin.core.scope.Scope.resolveInstance(Scope.kt:165)

我无法理解如何使用 KOIN 解决这个问题。

PS:我是 koin DI 的新手。

4

2 回答 2

0

您不应该在ViewModel构造函数中传递这些类型的参数。相反,您可以在 Activity 上将onCreate()传递的值设置为ViewModel. 因此,当您ViewModel在片段中访问它时,您肯定已经设置了该值。

class NoteViewModel (application: Application) : AndroidViewModel(application)
{
    var id:String = ""   
}

您的 koin 模块:

val noteModule = module(override = true) {
    viewModel { NoteViewModel(androidApplication()) }
}

活动:

class MainActivity : AppCompatActivity() {

    private val viewModel: NoteViewModel by viewModel()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel.id = intent?.getStringExtra("uid")?: ""

        supportFragmentManager.beginTransaction().replace(R.id.container, MyFrag()).commit()
    }
}

分段:

class MyFrag : Fragment() {

private val viewModel: NoteViewModel by sharedViewModel()

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    // your value will be available here.
    return inflater.inflate(R.layout.activity_main, container, false)
}

}

于 2019-07-04T10:12:14.003 回答
0

在应用程序类中初始化 koin 时有什么问题吗?我试过你的代码没有任何问题。我正在使用koin版本2.0.1

class App : Application() {

    override fun onCreate() {
        super.onCreate()

        val noteModule = module(override = true) {
            viewModel { (id: String) -> NoteViewModel(androidApplication(), id) }
        }

        startKoin {
            androidContext(this@App)
            modules(
                noteModule
            )
        }
    }

}

活动和片段:

class MainActivity : AppCompatActivity() {

    private val viewModel: NoteViewModel by viewModel { parametersOf(intent!!.getStringExtra("uid")) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d("NoteViewModel", "id: ${viewModel.id}")

        supportFragmentManager.beginTransaction().replace(R.id.main_root, Frag()).commit()
    }

}
class Frag : Fragment() {

    private val viewModel: NoteViewModel by sharedViewModel()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        Log.d("NoteViewModel", "id: ${viewModel.id}")
        return inflater.inflate(R.layout.activity_main, container, false)
    }
}

查看模型类:

class NoteViewModel (application: Application, val id: String) : AndroidViewModel(application)
于 2019-06-26T06:22:39.403 回答