在我的应用程序中,我有两个模块:app和repository。
repository依赖于 Room,并且有一个GoalRepository接口:
interface GoalRepository
Run Code Online (Sandbox Code Playgroud)
和一个GoalRepositoryImpl内部类,因为我不想将它或 Room 依赖项暴露给其他模块:
@Singleton
internal class GoalRepositoryImpl @Inject constructor(private val dao: GoalDao) : GoalRepository
Run Code Online (Sandbox Code Playgroud)
app取决于repository获取一个GoalRepository实例。目前,
我有一个:GoalRepositoryModule
@Module
class GoalRepositoryModule {
@Provides
@Singleton
fun provideRepository(impl: GoalRepositoryImpl): GoalRepository = impl
@Provides
@Singleton
internal fun provideGoalDao(appDatabase: AppDatabase): GoalDao = appDatabase.goalDao()
@Provides
@Singleton
internal fun provideDatabase(context: Context): AppDatabase =
Room.databaseBuilder(context, AppDatabase::class.java, "inprogress-db").build()
}
Run Code Online (Sandbox Code Playgroud)
问题是这不会编译(显然),因为公共provideRepository函数正在公开GoalRepositoryImpl,即一个internal类。
如何构建我的 Dagger …
我有课StartRouter。我想为每个活动提供此类的不同实例,并只要活动处于活动状态就保持活动状态(为此我所做的@ActivityScope)。
问题是它在我的代码中没有这样做。看起来 dagger 为每个注释提供了一个实例,在我的例子中,一次为@ActivityScope. 该瞄准镜是定制的匕首瞄准镜。
这是我的两个模块(每个活动一个),第一个模块:
\n\n@Module\npublic class SplashModule {\n\n @Provides\n SplashVMFactory splashVMFactory(StartRouter startRouter){\n return new SplashVMFactory(startRouter);\n\n\n @Provides\n StartRouter startRouter(){\n return new StartRouter();\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n第二个模块:
\n\n@Module\npublic class QuestionModule {\n\n @Provides\n QuestionVMFactory questionVMFactory(StartRouter startRouter){\n return new QuestionVMFactory(startRouter);\n }\n\n @Provides\n StartRouter startRouter(){\n return new StartRouter();\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我有这个:
\n\n@Module\npublic abstract class BinderModule {\n\n @ActivityScope\n @ContributesAndroidInjector(modules = SplashModule.class)\n abstract SplashActivity bindSplashActivity();\n\n @ActivityScope\n @ContributesAndroidInjector(modules = QuestionModule.class)\n abstract QuestionActivity bindQuestionActivity();\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我的应用程序组件:
\n\n …我对 Dagger 比较陌生,刚刚开始使用 Hilt。我想要的是将应用程序范围的存储库(意味着它在任何地方都需要是相同的对象)注入到ViewModel. 该存储库将用于检索用户、身份验证令牌等。这是我能得到的最接近的:
@Module
@InstallIn(ApplicationComponent::class)
abstract class ApplicationModule {
@Singleton
@Binds
abstract fun bindUserService(
userRepository: UserRepository
): UserService
}
@Singleton
class UserRepository @Inject constructor(
) : UserService {
private var _user: User? = null
override fun getUser(): Observable<User> {
return if (_user == null) {
fetchUser()
} else {
Observable.just(_user)
}
}
private fun fetchUser(): Observable<User> {
return Observable.just(User("foo", Random.nextDouble(100.00)))
.delay(2, TimeUnit.SECONDS)
.doOnEach { _user = it.value }
}
}
class ProfileViewModel @ViewModelInject constructor(
private val …Run Code Online (Sandbox Code Playgroud) @Inject 和 @Provide 有什么区别?
虽然两者都用于提供依赖项,但有什么区别?
我从头开始检查了所有内容,但找不到错误。我找不到错误,可能是什么?
我收到以下编译错误;
HomeViewModel.java:6: error: [ComponentProcessor:MiscError] dagger.internal.codegen.ComponentProcessor was unable to process this class because not all of its dependencies could be resolved. Check for compilation errors or a circular dependency with generated code.
public final class HomeViewModel extends androidx.lifecycle.ViewModel {
^
Run Code Online (Sandbox Code Playgroud)
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.movielistandroid">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:name="com.example.movielistandroid.Application"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MovieListAndroid">
<activity android:name=".ui.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="preloaded_fonts"
android:resource="@array/preloaded_fonts" />
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
应用程序.kt
package com.example.movielistandroid
import android.app.Application
import …Run Code Online (Sandbox Code Playgroud) 当我在项目中使用hilt时,我遇到了这个问题:
A problem occurred evaluating project ':app'.
> Failed to apply plugin 'dagger.hilt.android.plugin'.
> Could not create plugin of type 'HiltGradlePlugin'.
> Could not generate a decorated class for type HiltGradlePlugin.
> com/android/build/gradle/BaseExtension
Run Code Online (Sandbox Code Playgroud)
Unable to load class 'com.android.build.gradle.BaseExtension'.
This is an unexpected error. Please file a bug containing the idea.log file.
Run Code Online (Sandbox Code Playgroud)
主要问题是:无法应用插件“dagger.hilt.android.plugin”。
这是我的 build.gradle(模块)文件:
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
android {
compileSdk 30
defaultConfig {
applicationId "net.holosen.hiltdaggerapp"
minSdk 21
targetSdk …Run Code Online (Sandbox Code Playgroud) 我有一个项目,最近我们将该项目转换为多模块。但是我无法运行该模块,它给了我这个错误。
我认为我的依赖项和一些配置出了问题。以下是我的app/build.gradle
plugins {
id 'com.android.library'
id 'org.jetbrains.kotlin.android'
id 'com.google.protobuf'
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
id 'kotlin-android-extensions'
}
apply plugin: 'kotlin-android'
android {
compileSdk 33
defaultConfig {
minSdk 26
targetSdk 33
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
dataBinding true
}
packagingOptions{
pickFirst "androidsupportmultidexversion.txt"
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt' …Run Code Online (Sandbox Code Playgroud) 当您使用@Inject-annotated构造函数通知Dagger如何提供依赖项时,您可以稍后在模块中覆盖它吗?案例:我的生产代码使用带有带注释的构造函数的组件,我想在测试期间使用测试实现覆盖它.我的override = true模块会在测试期间成功覆盖生产实现吗?
或者更一般的问题,什么优先,模块或注释类?
目前使用dagger进行测试,我想要做的是实例化并注入不同的Bar实现.如何在提供的字段中注入字段?例如:
模块:
@Module(
injects = {
Main.class
},
complete = false,
library = true
)
public class ExampleTestModule {
@Provides
public Foo providesFoo() {
return new Foo();
}
@Provides
public Bar providesBar(BarImpl impl) {
// return new BarImpl(); // null
return impl;
}
}
Run Code Online (Sandbox Code Playgroud)
主要:
public class Main {
@Inject
Foo foo;
}
Run Code Online (Sandbox Code Playgroud)
富:
public class Foo {
@Inject
Bar bar;
}
Run Code Online (Sandbox Code Playgroud)
酒吧:
public interface Bar {
}
Run Code Online (Sandbox Code Playgroud)
BarImpl
public class BarImpl implements Bar {
}
Run Code Online (Sandbox Code Playgroud)
测试用例:
public class ApplicationTest …Run Code Online (Sandbox Code Playgroud) DataModule中:
@Module
class DataModule constructor(application: App){
private var db : Database = Room.databaseBuilder(application.applicationContext,
Database::class.java, "database.db")
.build()
@Provides
@PerApplication
fun provideDatabase(): Database {
return db
}
Run Code Online (Sandbox Code Playgroud)
应用程序:
class App : DaggerApplication() {
@Inject lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
override fun onCreate() {
super.onCreate()
setupTimber()
// setupCrashlytics()
RxPaparazzo.register(this)
}
override fun applicationInjector(): AndroidInjector<out App> {
return DaggerApplicationComponent.builder()
.dataModule(DataModule(this)).create(this)
}
Run Code Online (Sandbox Code Playgroud)
ApplicationComponent:
@PerApplication
@Component(modules = [AndroidSupportInjectionModule::class, ActivityBindingModule::class, ApplicationModule::class, DataModule::class, ServiceModule::class])
interface ApplicationComponent : AndroidInjector<App> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<App>()
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Error:(21, 2) …Run Code Online (Sandbox Code Playgroud)