【发布时间】:2019-12-22 00:26:49
【问题描述】:
我使用Kodein 作为kotlin 项目的注入依赖项。所以我有一个我的 ViewModel 工厂,如下所示
class ReadViewModelFactory(private val readRepository: ReadRepositoryImpl, private val activity: ReadActivity) : ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
val guid = activity.intent.getIntExtra(Constants.EXTRA_GUID, 0)
val pubDate = activity.intent.getStringExtra(Constants.EXTRA_DATE)
val title = activity.intent.getStringExtra(Constants.EXTRA_TITLE)
val headImage = activity.intent.getStringExtra(Constants.EXTRA_IMAGE_URL)
val kanal = activity.intent.getStringExtra(Constants.EXTRA_KANAL_READ)
val intentRead = IntentRead(guid, pubDate, title, headImage, kanal)
return ReadViewModel(readRepository, intentRead) as T
}
}
然后,在我的 Application 类中,我创建了:
class App : MultiDexApplication(), KodeinAware{
override val kodein = Kodein.lazy {
import(androidXModule(this@App))
bind() from singleton { NetworkConnectionInterceptor(instance()) }
bind() from singleton { ApiService(instance()) }
bind() from provider { ReadViewModelFactory(instance(),instance())}
}
override fun onCreate() {
super.onCreate()
}
}
如您所见,我的ReadViewModelFactory 有两个参数。但是当我运行我的应用程序崩溃发生在ReadActivity。控制台日志说什么
java.lang.RuntimeException:无法启动活动 组件信息{id.my.app/id.my.app.ui.read.ReadActivity}: org.kodein.di.Kodein$NotFoundException:没有找到绑定 bind() 与 ?().? { ? } 在此 Kodein 容器中注册:
我的ReadActivity 如下所示:
class ReadActivity : AppCompatActivity(), KodeinAware{
override val kodein by kodein()
private val factory : ReadViewModelFactory by instance()
.......
}
全栈跟踪
08-21 11:23:54.807 27186-27186/id.my.app E/AndroidRuntime: 致命 例外:主要 进程:id.my.app,PID:27186 java.lang.RuntimeException:无法启动活动 ComponentInfo{id.my.app/id.grid.app.ui.read.ReadActivity}: org.kodein.di.Kodein$NotFoundException:没有找到绑定 bind() 与 ?().? { ? } 在此 Kodein 容器中注册: bind() 与提供者 { ReadViewModelFactory } bind() 与单例 { HomeFragmentRepositoryImpl } bind() 与提供者 { HomeFragmentViewModelFactory } bind() 与提供者 { HomeViewModelFactory } bind() 与单例 { NetworkConnectionInterceptor } bind() 与单例 { HomeRepositoryImpl } bind() 与单例 { ReadRepositoryImpl } bind() 与单例 { ApiService } 模块androidModule { bind(tag = "externalCache") with contexted().provider { File } bind() 与 contexted().provider { MediaProjectionManager } bind() 与 contexted().provider { JobScheduler } bind(tag = "files") with contexted().provider { File } bind(tag = "cache") with contexted().provider { File } bind() 与 contexted().provider { TvInputManager } bind() 与 contexted().provider { PrintManager } bind(tag = "packageCodePath") with contexted().provider { String } bind() 与 contexted().provider { AccountManager } bind() 与 contexted().provider { UiModeManager } bind() 与 contexted().provider { ApplicationInfo } bind() 与 contexted().provider { Looper } bind() 与 contexted().provider { WindowManager } bind() 与 contexted().provider { UsageStatsManager } bind() 与 contexted().provider { InputMethodManager } bind() 与 contexted().provider { MediaRouter } bind() 与 contexted().provider { ActivityManager } bind() 与 contexted().provider { RestrictionsManager } bind() 与 contexted().provider { SensorManager } bind() 与 contexted().provider { LauncherApps } bind() 与 contexted().provider { Resources.Theme } bind() 与 contexted().provider { DropBoxManager } bind() 与 contexted().provider { AccessibilityManager } bind() 与 contexted().provider { AssetManager } bind() 与 contexted().provider { CarrierConfigManager } bind() 与 contexted().provider { AudioManager } bind() 与 contexted().provider { MidiManager } bind() 与 contexted().provider { MediaSessionManager } bind() 与 contexted().provider { InputManager } bind() 与 contexted().provider { WallpaperManager } bind() 与 contexted().provider { PackageManager } bind() 与 contexted().provider { DownloadManager } bind() 与 contexted().provider { BatteryManager } bind() 与 contexted().provider { SharedPreferences } 绑定
【问题讨论】:
-
这看起来像是一个 proguard / dexguard 问题。您的项目中是否启用了 minyfying ?
-
minifyEnabled false 在我的 gradle 中
-
你能发布完整的堆栈跟踪吗?
-
我已经用完整的堆栈跟踪更新了我的问题
-
我想我知道是什么原因造成的。这是因为我使用 Activity 作为 ReadViewModelFactory 的参数。实际上,大多数教程都使用上下文,但我需要活动
标签: android kotlin mvvm dependency-injection kodein