我正在玩 Gradle java 项目,并且很难让注释处理器运行。由于某种原因,当我运行 intellij 配置(如下图所示)时,注释处理器未运行。我假设这是因为配置将命令Make配置为在启动之前运行。注释处理器似乎在调用assemble或时运行。build
调用 时可以重现该问题./gradlew clean make。我打电话时没有这个问题./gradlew clean assemble,或者./gradlew clean build。解决这个问题的最佳做法是什么?
通常在 Android 代码中,我们使用这种模式将数据存储在 Application 对象中,然后通过转换访问它,如下所示:
((MyApplicationObject)getApplication()).getDaggerComponent()
Run Code Online (Sandbox Code Playgroud)
getApplication()应该总是MyApplicationObject因为我已经在AndroidManifest.xml. 但是,当您部署此代码时,有时它会导致 aClassCastException而我们得到一个不同的对象。
怎么会这样?
此问题的正确解决方法是什么?
我正在尝试在新应用程序中实现 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 文件中): …
看过很多 Dagger 演示应用程序后,我不清楚业务对象放在哪里。在典型的三层应用程序中,您有 ui、业务层和数据访问层。MVP 本质上是一个三层架构。
Dagger 处理组件和模块,我见过演示应用程序将业务逻辑放在模块中。但是根据 MVP 架构,业务逻辑属于 Presenter 层,因为该层被认为是 ui 和模型之间的桥梁。许多这些演示应用程序的模型仅包含一个类,其中包含用于存储和检索数据的公共字段。
有人可以澄清应该这样做的正确方法。
所以我正在使用 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) 我正在从这里上课: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 上不起作用吗?
将 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) 我正在使用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)
这是应该这样做还是我做错了什么?
谢谢!
我正在尝试为我的 navController 提供匕首柄。但我使用的方法不起作用。我想提供 navController 以便通过构造函数注入将其注入我的片段中。
private val navController by lazy { findNavController() }
private val appBarConf by lazy { AppBarConfiguration(navController.graph) }
Run Code Online (Sandbox Code Playgroud)
@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
我正在尝试将项目迁移到 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)
我错过了什么吗?