标签: dagger

Java Gradle IntelliJ 项目的 Dagger 2 注释处理器未运行

我正在玩 Gradle java 项目,并且很难让注释处理器运行。由于某种原因,当我运行 intellij 配置(如下图所示)时,注释处理器未运行。我假设这是因为配置将命令Make配置为在启动之前运行。注释处理器似乎在调用assemble或时运行。build

调用 时可以重现该问题./gradlew clean make。我打电话时没有这个问题./gradlew clean assemble,或者./gradlew clean build。解决这个问题的最佳做法是什么?

在此输入图像描述

java intellij-idea gradle dagger dagger-2

1
推荐指数
1
解决办法
4896
查看次数

ClassCastException:应用程序对象不是我的自定义应用程序对象

通常在 Android 代码中,我们使用这种模式将数据存储在 Application 对象中,然后通过转换访问它,如下所示:

((MyApplicationObject)getApplication()).getDaggerComponent()
Run Code Online (Sandbox Code Playgroud)

getApplication()应该总是MyApplicationObject因为我已经在AndroidManifest.xml. 但是,当您部署此代码时,有时它会导致 aClassCastException而我们得到一个不同的对象。

怎么会这样?

此问题的正确解决方法是什么?

android dagger dagger-2

1
推荐指数
1
解决办法
362
查看次数

Dagger2 与 Androidx,SupportFragmentInjector 问题

我正在尝试在新应用程序中实现 Dagger2 注入,唯一失败的是 DaggerAppCompatActivity 和 SupportFragmentInjector。

当我转到 DaggerAppCompatActivity 代码时,我看到:

在此处输入图片说明

它尝试在 androidx 重构之前从库版本中引用 AppCompatActivity 和 Fragment。当我继承这个类时,我什至不能调用 setContentView(),因为它不可用。

我想将此代码复制粘贴到我自己的基本活动中,但 HasSupportFragmentInjector 使用 pre-adroidX Fragment。

有没有办法让它与 AndroidX 一起工作?

编辑:这是我在尝试使用 DaggerAppCompatActivity 作为@ContributesAndroidInjector 提到的活动的基类时得到的错误。如果我只是简单地做 AndroidInjection.inject(this) 而不是这个继承,它工作得很好。

C:\Users\micha\Workspace\StudioProjects\BirthdayGift\app\build\tmp\kapt3\stubs\debug\com\mpowloka\birthdaygift\common\di\ApplicationComponent.java:8: error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] java.util.Map<java.lang.Class<? extends androidx.fragment.app.Fragment>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends androidx.fragment.app.Fragment>>> cannot be provided without an @Provides-annotated method.
public abstract interface ApplicationComponent {
                ^
      java.util.Map<java.lang.Class<? extends androidx.fragment.app.Fragment>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends androidx.fragment.app.Fragment>>> is injected at
          dagger.android.DispatchingAndroidInjector.<init>(injectorFactories)
      dagger.android.DispatchingAndroidInjector<androidx.fragment.app.Fragment> is injected at
          dagger.android.support.DaggerAppCompatActivity.supportFragmentInjector
      com.mpowloka.birthdaygift.persons.PersonsActivity is injected at
          dagger.android.AndroidInjector.inject(T)
  component path: com.mpowloka.birthdaygift.common.di.ApplicationComponent ? com.mpowloka.birthdaygift.common.di.ActivityBindingModule_PersonsActivity.PersonsActivitySubcomponent
Run Code Online (Sandbox Code Playgroud)

编辑 2:我的项目依赖项(包含在单独的 gradle 文件中): …

android android-support-library dagger androidx

1
推荐指数
1
解决办法
2559
查看次数

在 Dagger/MVP 应用程序中放置业务逻辑的位置

看过很多 Dagger 演示应用程序后,我不清楚业务对象放在哪里。在典型的三层应用程序中,您有 ui、业务层和数据访问层。MVP 本质上是一个三层架构。

Dagger 处理组件和模块,我见过演示应用程序将业务逻辑放在模块中。但是根据 MVP 架构,业务逻辑属于 Presenter 层,因为该层被认为是 ui 和模型之间的桥梁。许多这些演示应用程序的模型仅包含一个类,其中包含用于存储和检索数据的公共字段。

有人可以澄清应该这样做的正确方法。

mvp android dagger

1
推荐指数
1
解决办法
773
查看次数

使用 Dagger 时我们真的需要 viewModelFactories 和 viewmodelProviders 吗?

所以我正在使用 Dagger 开发一些示例 MVVM 项目。我有一个视图模型工厂,如下所示:

class DaggerViewModelFactory @Inject constructor(private val viewModelsMap: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) :
    ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        val creator = viewModelsMap[modelClass] ?:
        viewModelsMap.asIterable().firstOrNull {
            modelClass.isAssignableFrom(it.key)
        }?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
        return try {
            creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

视图模型工厂模块

@Module
abstract class ViewModelFactoryModule {
    @Binds
    abstract fun bindViewModelFactory(viewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory
}
Run Code Online (Sandbox Code Playgroud)

我有一个 ViewModelModule:

@Module
abstract class MyViewModelModule {
    @Binds
    @IntoMap …
Run Code Online (Sandbox Code Playgroud)

mvvm dagger dagger-2 android-mvvm android-viewmodel

1
推荐指数
1
解决办法
1415
查看次数

Dagger2 和 Kotlin:@Binds 不适用于 @IntoMap

我正在从这里上课:https ://dagger.dev/tutorial/07-two-for-the-price-of-one

当我更改代码时

@Module
abstract class HelloWorldModule {
    @Binds
    abstract fun helloWorldCommand(command: HelloWorldCommand): Command
}
Run Code Online (Sandbox Code Playgroud)

进入

@Module
abstract class HelloWorldModule {
    @Binds
    @IntoMap
    @StringKey("hello")
    abstract fun helloWorldCommand(command: HelloWorldCommand): Command
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

error: [Dagger/MissingBinding] Map<String,? extends Command> 
cannot be provided without an @Provides-annotated method.
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?它在 Kotlin 上不起作用吗?

dependency-injection kotlin dagger dagger-2

1
推荐指数
1
解决办法
1037
查看次数

为什么 dagger graph 在 java 中可以工作,但在 Kotlin 中却说缺少 Provides,而我已经提供了?

将 dagger 接口从 java 转换为 Kotlin 时遇到一些问题

我得到 [Dagger/MissingBinding] java.util.Map 如果没有 @Provides 注释的方法就无法提供。

这是我的界面

   interface TopicConfigModule {
    @Binds
    @IntoMap
    @StringKey(NAME)
    fun bindCommandHandler(handler: TopicCommandHandler): CommandHandler

    companion object {
        @JvmStatic
        @Provides
        @FragmentScope
        fun provideHubsConfig(
            commandRegistry: Map<String, CommandHandler>
        ): Config {
            return ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

CommandHandler是java接口

public interface HubsCommandHandler {```}


Run Code Online (Sandbox Code Playgroud)

java android kotlin dagger dagger-2

1
推荐指数
1
解决办法
236
查看次数

从 Fragment 调用 Hilt-Dagger ViewModel

我正在使用ViewModel更新操作栏中的标题

共享视图模型

class SharedViewModel @ViewModelInject constructor(
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {

    val title: MutableLiveData<String> by lazy {
        MutableLiveData<String>()
    }

    val backButton: MutableLiveData<Boolean> by lazy {
        MutableLiveData<Boolean>()
    }
}
Run Code Online (Sandbox Code Playgroud)

主活动观察者

@AndroidEntryPoint
...
sharedViewModel.title.observe(this, Observer {
    supportActionBar?.title = it
})
Run Code Online (Sandbox Code Playgroud)

使用下面的代码似乎创建了一个新实例Fragment(在调试器中检查):

@AndroidEntryPoint
...
private val viewModel: SharedViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)

但似乎以这种方式工作

val viewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

文章参考

这是应该这样做还是我做错了什么?

谢谢!

android viewmodel kotlin dagger dagger-hilt

1
推荐指数
1
解决办法
1744
查看次数

Android:匕首柄,注入导航组件

我正在尝试为我的 navController 提供匕首柄。但我使用的方法不起作用。我想提供 navController 以便通过构造函数注入将其注入我的片段中。

没有 Di.Module、FragmentClass

private val navController by lazy { findNavController() }
private val appBarConf by lazy { AppBarConfiguration(navController.graph) }
Run Code Online (Sandbox Code Playgroud)

目前的方法,Di.Module

@Module
@InstallIn(ApplicationComponent::class)
object AndroidModule {

@Provides
fun provideNavController(@ApplicationContext context: Context): NavController = lazy {
    (context as AppCompatActivity).findNavController(R.navigation.nav_main)
}.value

@Provides
fun provideAppbarConfiguration(navController: NavController): AppBarConfiguration = lazy {
    AppBarConfiguration(navController.graph)
}.value
}
Run Code Online (Sandbox Code Playgroud)

我还创建了 FragmentFactory 类,以便通过构造函数注入我的依赖项。我知道这(context as AppCompatActivity)是这里的问题,但我不知道正确的解决方案。

我感谢每一个帮助,谢谢!

错误

引起原因:java.lang.ClassCastException:com.example.app.App无法转换为androidx.appcompat.app.AppCompatActivity

android kotlin dagger dagger-hilt

1
推荐指数
1
解决办法
8508
查看次数

如何为 Hilt Android 提供上下文?

我正在尝试将项目迁移到 Hilt,但面临以下问题,不确定如何使用 Hilt 传递上下文。如果我删除provideContext方法,那么它会抱怨以下错误:

error: [Dagger/MissingBinding] @dagger.hilt.android.qualifiers.ApplicationContext android.content.Context cannot be provided without an @Provides-annotated method.
Run Code Online (Sandbox Code Playgroud)

但我的理解是,在 Hilt 中我们不需要provideContext方法,我们可以@ApplicationContext像下面这样使用:

@Inject
public CardLayoutManager(@ApplicationContext Context context) {
    mContext = context;
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

android dependency-injection kotlin dagger dagger-hilt

1
推荐指数
1
解决办法
1145
查看次数