我用带有koin的mvvm模式制作项目,但我始终找不到定义库
我在viewmodel之前先在模块应用中定义存储库,但出现一些错误
Gradle应用
// Koin for Android
implementation "org.koin:koin-android:$rootProject.koin_version"
// Koin Android Scope features
implementation "org.koin:koin-androidx-scope:$rootProject.koin_version"
// Koin Android ViewModel features
implementation "org.koin:koin-androidx-viewmodel:$rootProject.koin_version"
模块
val dataModule = module {
//remoteData
single { AppRemoteData() }
//repository
single{ AppRepository(get()) as AppDataSource}
// viewmodel
viewModel{ ListHomeViewModel(get()) }
viewModel { LoginViewModel(get()) }
定义模块
val myAppModule = listOf(appModule, dataModule)
在应用中
startKoin {
androidLogger(Level.DEBUG)
androidContext(this@MainApp)
modules(myAppModule)
}
存储库类
class AppRepository(val appRemoteDataSource: AppRemoteData) : AppDataSource {
override fun loginAccount(email: String, password: String) : LiveData<String> {
val data = MutableLiveData<String>()
appRemoteDataSource.loginAccount(email,password,object : AppDataSource.LoginCallback{
override fun onSucces(id: String?) {
//berhasil
data.postValue(id)
}
override fun onFailed(message: String?) {
data.postValue(message)
d(message)
}
override fun onFailure(message: String?) {
data.postValue(message)
d(message)
}
})
return data
}
AppRemoteData
class AppRemoteData {
val ref = FirebaseDatabase.getInstance().getReference("user")
var auth = FirebaseAuth.getInstance()
fun loginAccount(email: String, password: String, callback: AppDataSource.LoginCallback) {
auth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener {
task ->
if(task.isComplete){
callback.onSucces(task.result?.user?.providerId)
}else{
callback.onFailed(task.exception?.localizedMessage)
}
}
}}
此处错误消息
答案 0 :(得分:1)
错误消息告诉您Koin无法为您创建
-- Production Code
args={
"owner":"EB",
"start_date":datetime.datetime(2019, 7, 9),
'retries': 3,
'retry_delay': timedelta(minutes=1),}
dag = DAG(
dag_id='**_scoring_prod',
default_args=args,
schedule_interval='15 15 * * 0',
catchup=False,
dagrun_timeout=timedelta(minutes=60)
)
实例,因为它在创建过程中不得不提供LoginViewModel
的实例,但是您没有告诉它怎么做。
我的猜测是,您不小心直接在AppRepository
构造函数中使用了AppRepository
类型,而不是使用将存储库实例绑定到模块中的LoginViewModel
因此,如果您有类似这样的内容,则需要专门使用AppDataSource
:
AppRepository
您应该用它代替它,在这里您只要求Koin提供一个class LoginViewModel(val dataSource: AppRepository) : ViewModel()
,您已经对其进行了配置以使其能够提供:
AppDataSource
答案 1 :(得分:0)
如果ViewModel中有一个接口作为参数。
class WalletViewModel(val interfaceName: InterfaceName) : ViewModel()
在模块定义中,使用 singleBy <> 代替Single()。
singleBy<InterfaceName,InterfaceNameImplementation>()
最后加入您的ViewModel
viewModel { MyViewModel(get()) }
这在Koin 2.0中对我有用
希望它会有所帮助:)