Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果没有@Providers注释的方法,则无法提供MainActivityModule_Android_Dagger 2 - Fatal编程技术网

Android 如果没有@Providers注释的方法,则无法提供MainActivityModule

Android 如果没有@Providers注释的方法,则无法提供MainActivityModule,android,dagger-2,Android,Dagger 2,我第一次在android中使用dagger2,我尝试使用与google/iosched相同的结构来反映我的项目。但是当我编译下面这个简单的项目时,它报告说,MainActivityModule不能在其中使用 // MainApplication.kt class MainApplication : DaggerApplication() { ... override fun applicationInjector(): AndroidInjector<out Dagg

我第一次在android中使用dagger2,我尝试使用与
google/iosched
相同的结构来反映我的项目。但是当我编译下面这个简单的项目时,它报告说,
MainActivityModule
不能在其中使用

// MainApplication.kt

class MainApplication : DaggerApplication() {

    ...

    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.factory().create(this)
    }

    ...
}


// AppComponent.kt

@Singleton
@Component(
    modules = [
        AndroidSupportInjectionModule::class,
        AppModule::class,
        ActivityBindingModule::class,
        ViewModelModule::class
    ]
)
interface AppComponent : AndroidInjector<MainApplication> {
    @Component.Factory
    interface Factory {
        fun create(@BindsInstance application: MainApplication): AppComponent
    }
}


// ActivityBindingModule.kt

@Module
@Suppress("UNUSED")
abstract class ActivityBindingModule {

    @ActivityScoped
    @ContributesAndroidInjector(
        modules = [
            // activity
            MainActivityModule::class
        ]
    )
    internal abstract fun mainActivity(): MainActivity
}


// MainActivity.kt

class MainActivity : DaggerAppCompatActivity() {

    @Inject lateinit var viewModelFactory: ViewModelProvider.Factory
    @Inject lateinit var viewModel: MainActivityModule

    override fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.AppTheme)
        super.onCreate(savedInstanceState)

        viewModel = viewModelProvider(viewModelFactory)
    }
    ...
}


// MainActivityModule.kt

@Module
@Suppress("UNUSED")
abstract class MainActivityModule {

    @Binds
    @IntoMap
    @ViewModelKey(MainActivityViewModel::class)
    internal abstract fun bindViewModel(viewModel: MainActivityViewModel): ViewModel
}


// MainActivityViewModel.kt

class MainActivityViewModel @Inject constructor(

) : ViewModel() {

}
//MainApplication.kt
类MainApplication:DaggerApplication(){
...
重写有趣的applicationInjector():AndroidInjector{
返回DaggerAppComponent.factory().create(此)
}
...
}
//AppComponent.kt
@独生子女
@组成部分(
模块=[
AndroidSupportInjectionModule::类,
AppModule::类,
ActivityBindingModule::类,
ViewModelModule::类
]
)
接口组件:AndroidJector{
@组件工厂
接口工厂{
趣味创建(@BindsInstance应用程序:main应用程序):AppComponent
}
}
//ActivityBindingModule.kt
@模块
@抑制(“未使用”)
抽象类ActivityBindingModule{
@活动范围
@贡献Android注射器(
模块=[
//活动
MainActivityModule::类
]
)
内部抽象趣味mainActivity():mainActivity
}
//MainActivity.kt
类MainActivity:DaggerAppCompatActivity(){
@注入lateinit var viewModelFactory:ViewModelProvider.Factory
@注入lateinit变量viewModel:MainActivityModule
重写创建时的乐趣(savedInstanceState:Bundle?){
setTheme(R.style.AppTheme)
super.onCreate(savedInstanceState)
viewModel=viewModelProvider(viewModelFactory)
}
...
}
//MainActivityModule.kt
@模块
@抑制(“未使用”)
抽象类MainActivityModule{
@束缚
@英托马普
@ViewModelKey(MainActivityViewModel::class)
内部抽象视图模型(视图模型:MainActivityViewModel):视图模型
}
//MainActivityViewModel.kt
类MainActivityViewModel@Inject构造函数(
):ViewModel(){
}
下面是错误消息

[Dagger/MissingBinding] com.example.app.di.MainActivityModule cannot be provided without an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.example.app.MainApplication> {
                ^
      com.example.app.di.MainActivityModule is injected at
          com.example.app.ui.MainActivity.viewModel
      com.example.app.ui.MainActivity is injected at
[Dagger/MissingBinding]com.example.app.di.MainActivityModule如果没有@Provides注释方法,则无法提供。
公共抽象接口AppComponent扩展了dagger.android.AndroidJector{
^
com.example.app.di.MainActivityModule在
com.example.app.ui.MainActivity.viewModel
com.example.app.ui.main活动在
注意,注入了一个MainActivityViewModel

private lateinit var viewModel: MainActivityViewModel
@Inject lateinit var viewModel: MainActivityModule
当您注入MainActivity模块时:

private lateinit var viewModel: MainActivityViewModel
@Inject lateinit var viewModel: MainActivityModule
这里有几个注意事项:

  • 模块用于配置Dagger:您不需要从ViewModels、Activities、Views或其他类中插入或引用模块。只有当您的模块不是接口或抽象(开放)类,并且没有公共无参数构造函数时,才应该与模块实例进行交互

  • 尽管您几乎不应该在图形中插入模块,但Dagger将允许您在且仅当模块绑定到图形中时才这样做。这就是您应该如何阅读错误消息:“com.example.app.di.MainActivityModule在没有@Providers注释方法的情况下无法提供”;由于您已通过
    @Inject
    请求一个MainActivityModule,而Dagger不知道如何提供,因此它会抛出此编译时异常

  • 请注意,iosched的MainActivity.kt没有将MainActivityViewModel标记为可注入;它会像您在此处发布的代码中所做的那样手动创建实例。您应该构造实例或Dagger-should,但不能两者都构造。(Dagger有时用于在现有实例上填充
    @Inject
    字段,但在这里不这样做。)因此,在任何情况下,您都可以删除
    @Inject
    注释,Dagger将不再担心它


  • 你能在这里发布详细的错误信息还是完整的stacktrace