【问题标题】:Koin No definition found for class, but already declaredKoin 未找到类的定义,但已声明
【发布时间】:2020-07-23 15:54:42
【问题描述】:

我正在尝试使用 Koin 作为我的 D.I 来实现权限注入 但是,当我执行需要 PermissionRepository 的 ViewModel 时,我一直收到错误消息。

找不到类的定义:'ni.com.repository.PermissionRepositoryImplement'。检查你的定义!

目前项目的结构是这样的。

基础应用程序

class BaseApplication : Application() {
    companion object{
        lateinit var context: BaseApplication
        val allAppModules = listOf(coilModule, permissionsModule, blurModule, remoteDataSourceModule, preferencesModule, databaseModule, viewModelModule)
    }

    override fun onCreate() {
        super.onCreate()
        context = this
        startKoin {
            androidLogger()
            androidContext(this@BaseApplication)
            modules(allAppModules)
        }
        if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree())
    }
}

PermissionModule 但是我需要一个 Activity 来显示权限请求。在 Jetpack Navigation 之后,我使用 MainActivity 作为 Base 并注入到存储库中

val permissionsModule = module {
    scope<MainActivity> {
        scoped {
            PermissionRepositoryImplement(get<MainActivity>())
        }
    }
}

ViewModel 模块

val viewModelModule = module {
    viewModel { PermissionViewModel(get()) }
}

然后是 PermissionRepositoryImplement

class PermissionRepositoryImplement(private val activity: Activity){
    companion object{
        private val map = Permission.values().associateBy(Permission::permissionValue)
        operator fun get(value: String) = (map[value] ?: error("NOT FOUND"))
    }

    enum class Key {
        granted, denied, forbidden
    }

    enum class Permission(val permissionValue: String) {
        WRITE_EXTERNAL_STORAGE(Manifest.permission.WRITE_EXTERNAL_STORAGE), READ_EXTERNAL_STORAGE(Manifest.permission.READ_EXTERNAL_STORAGE), CAMERA(Manifest.permission.CAMERA), INTERNET(Manifest.permission.INTERNET), INTERNET_STATE(Manifest.permission.ACCESS_WIFI_STATE), NETWORK_STATE(Manifest.permission.ACCESS_NETWORK_STATE),
    }

    private var result = HashMap<String, String>()

    fun requestPermission(permissionName: String): HashMap<String, String> {
        activity.let {
            it.askPermissions(get(permissionName).permissionValue) {
                onGranted {
                    result[permissionName] = Key.granted.name
                }
                onDenied {
                    result[permissionName] = Key.denied.name
                }
                onShowRationale { request ->
                    Snackbar.make(it.findViewById(R.id.container), String.format(it.getString(R.string.permissionRequested), Permission.values().filter { p -> p.permissionValue == permissionName }[0]), Snackbar.LENGTH_INDEFINITE)
                        .setAction("Retry") { request.retry() }
                        .show()
                }
                onNeverAskAgain {
                    result[permissionName] = Key.forbidden.name
                }
            }
        }
        return result
    }
}

最后是 PermissionViewModel

class PermissionViewModel (private val permissionImplement: PermissionRepositoryImplement): ViewModel() {

    private val _uiState = MutableLiveData<CredentialsDataState>()
    val uiState: LiveData<CredentialsDataState> get() = _uiState

    fun requestPermission(){
        viewModelScope.launch {
            runCatching {
                emitUiState(showProgress = true)
                permissionImplement.requestPermission(PermissionRepositoryImplement.Permission.CAMERA.permissionValue)
            }.onSuccess {
                emitUiState(result = Event(it))
            }.onFailure {
                emitUiState(error = Event(R.string.error))
            }
        }
    }

    private fun emitUiState(showProgress: Boolean = false, result: Event<HashMap<String, String>>? = null, error: Event<Int>? = null){
        val dataState = CredentialsDataState(showProgress, result, error)
        _uiState.value = dataState
    }

    data class CredentialsDataState(val showProgress: Boolean, val result: Event<HashMap<String, String>>?, val error: Event<Int>?)
}

在本节之前,一切都应该按照 koin 的需要进行。 但是我总是收到我的 PermissionRepositoryImplement 没有定义的错误......

【问题讨论】:

    标签: android kotlin mvvm koin


    【解决方案1】:
    val permissionsModule = module {
      scope<MainActivity> {
        scoped {
            PermissionRepositoryImplement(get<MainActivity>())
        }
    }
    

    }

    您还没有提供 MainActivity 实例来 koin。那是你出错了。

    据我了解,我们不应该尝试创建 android 组件{activity, broadcast receiver, service, content provider} 我会建议使用片段扩展 PermissionRepositoryImplement。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2022-08-03
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多