Android Studio 3.4
kotlin 1.3.0
dagger 2.21
Run Code Online (Sandbox Code Playgroud)
我有一个项目,有一个presentation和data模块。我正在尝试在数据模块中创建测试组件。我可以为演示模块生成组件。我正在使用 kotlin-kts 进行 gradle 构建。
对于演示模块,我有以下内容 build.gradle.kts
plugins {
id("com.android.application")
kotlin("android")
kotlin("kapt")
}
android {
compileSdkVersion(Versions.compileSdkVersion)
defaultConfig {
applicationId = "nz.org.westforce.mobileui"
minSdkVersion(Versions.minSdkVersion)
targetSdkVersion(Versions.targetSdkVersion)
versionCode = Versions.versionCode
versionName = Versions.versionName
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
getByName("release") {
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
}
dependencies {
implementation(Libraries.appCompat)
implementation(Libraries.kotlinStdlib)
implementation(Libraries.daggerAndroid)
implementation(Libraries.daggerSupport)
kapt(Libraries.daggerCompiler)
kapt(Libraries.daggerProcessor)
androidTestImplementation(TestLibraries.runner)
androidTestImplementation(TestLibraries.espressoCore)
testImplementation(TestLibraries.junit)
testImplementation(Libraries.daggerAndroid)
testImplementation(Libraries.daggerSupport)
kaptTest(Libraries.daggerCompiler)
kaptTest(Libraries.daggerProcessor)
implementation(project(":data"))
}
Run Code Online (Sandbox Code Playgroud)
对于演示模块,我有以下应用程序:
class WestforceCreditUnionMobileuiApplication
: Application(), HasActivityInjector { …Run Code Online (Sandbox Code Playgroud) 如何实现一个ViewModelFactory来提供我的项目ViewModels及其对整个项目的依赖?
尝试添加匕首后我无法构建项目
我刚开始使用 kotlin 我使用了一个示例 Dagger 2 项目在某个时候我的项目停止启动
尝试的解决方案:
Invalidate Caches/Restart Build -> Clean Project 更新 kotlin 插件,使用最新版本的 kotlin
构建:gradle(模块:应用程序)
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.app"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
kotlinOptions {
jvmTarget = '1.8'
}
dataBinding {
enabled = …Run Code Online (Sandbox Code Playgroud) 我有一个接口BaseProcessor和它的几个实现。
现在,在一个类 ( ValidationComponent) 中,我想要一个包含所有 BaseProcessor 实现的列表,如下所示:List<BaseProcessor> processors;
所有的实现都有一个@Inject构造函数。
现在,目前我正在这样做:在ValidationComponent课堂上,
private List<BaseProcessor> processors;
@Inject
public ValidationComponent(@NonNull final ProcessorImpl1 processor1,
@NonNull final ProcessorImpl2 processor2,
@NonNull final ProcessorImpl3 processor3) {
this.processors = new ArrayList<>();
this.processors.add(processor1);
this.processors.add(processor2);
this.processors.add(processor3);
}
Run Code Online (Sandbox Code Playgroud)
为了将实现传递给构造函数,dagger 正在创建这些实现的实例,因为如前所述,它们都有@Inject构造函数。
现在,不是在构造函数中传递每个具体实现,我可以以某种方式使用 Dagger 为我创建所有这些实现实例吗?
我知道在 Spring 框架中可以通过使用@Componentspring 注释来注释实现。Dagger 中有办法吗?
在我的应用程序中,我有一个需要访问 ViewModel 的 MainActivity。我正在使用 DaggerHilt 和 @ViewModelInject 注释注入 ViewModel。此外,我在 Activity 中有两个 Fragment,它们需要访问同一个 ViewModel,以便使用 observable 相互传递数据。
问题:我发现每当我的一个 Fragment 通过onDestroy()它的 ViewModel 时就会被杀死。这让我认为 Activity 和 Fragment 没有共享同一个 ViewModel。
我的问题:有谁知道我们是否应该在 Dagger Hilt 中为 ViewModel 使用范围注释?我在 Hilt 文档或 android 开发教程/指南中没有看到这一点。我曾假设他们正在制作 ViewModels 应用程序级别的单例,这是有道理的。
如果我们必须为 ViewModel 使用范围注释,有没有人知道哪个级别合适?
这是我的视图模型代码:
class MainActivityViewModel @ViewModelInject constructor(
private val repo: Repo,
private val rxSharedPrefsRepo: RxSharedPrefsRepo,
private val resourcesRepo: ResourcesRepo,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
Run Code Online (Sandbox Code Playgroud) 我是 Android 依赖注入的新手。我正在使用 Dagger-Hilt,并且在我为 DB 提供程序生成的 AppModule 类中出现错误并且项目无法编译。
错误是@InstallIn can only be used on @Module or @EntryPoint classes
这是我的 AppModule 对象。我哪里出错了?
@Module
@InstallIn(ApplicationComponent::class)
object AppModule {
@Singleton
@Provides
fun provideAppDatabase(
@ApplicationContext app: Context
) = Room.databaseBuilder(
app,
AppDatabase::class.java,
"gelirkenal"
).build()
@Singleton
@Provides
fun provideItemDao(db: AppDatabase) = db.itemDao()
}
Run Code Online (Sandbox Code Playgroud) 我正在学习使用 Hilt 和 Dagger 进行依赖注入,我想知道...当使用 Singleton 模式创建类时,我应该使用真正的 Singleton 还是 Hilt 注释?我在互联网上搜索,但找不到显示差异的结论性解决方案,而且当我单击从 Hilt 打开生成的文件时,它看起来不像单例,它是“threadissuesproof”吗?
“真正的单例”,像这样:
class SongController private constructor() {
companion object {
@Volatile
private var INSTANCE: SongController? = null
fun getInstance(): SongController {
synchronized(this) {
var instance = INSTANCE
if (instance == null) {
instance = SongController()
INSTANCE = instance
}
return instance
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者 Hilt 的 @Singleton 注释?
@Singleton
class SongController @Inject constructor() {}
Run Code Online (Sandbox Code Playgroud)
使用注释有什么好处吗?最好、最安全的选择仍然是 getInstace() ->synchronized() 块?
在这种情况下我应该使用哪一个?
我不明白的最重要的问题是,注释的行为方式是否相同?
我是Agorava的技术主管,Agorava是一个帮助消费社交网络数据的框架.
今天,Agorava基于CDI构建,以简化其在Java EE堆栈中的使用,但我们希望为Dagger提供一个实现,以便为Android提供更轻松的解决方案.
我的问题是:我们可以在CDI和Dagger实现之间共享通用的JSR 330兼容代码吗?换句话说,是否有可能与匕首在罐子轴承JSR 330注释已经编译代码和源代码延伸或在一个特定匕首罐使用此代码(与@Provides,@Modules和其他匕首特定项目)?
如果答案是否,是否有任何问题用Dagger编译器编译我的常见JSR 330 jar并在我的CDI实现中使用它?更准确地说@Inject,限定符和其他JSR 330细节仍然可以在运行时使用,带有这些注释代码的类是否仍然不受Dagger编译器的影响?最后是否有一种关于Dagger生成的代码(类名,注释)的跟踪器,以允许CDI检测它并忽略它?
想象一下匕首module有以下两种方法来提供一个物体.
@Provides @Singleton Cache<Settings> providesSettingsCache( Database db )
{
return new StateCache( db, BuildConfig.VERSION_CODE );
}
@Provides @Singleton Cache<User> providesUserCache( Database db )
{
return new StateCache( db, BuildConfig.VERSION_CODE );
}
Run Code Online (Sandbox Code Playgroud)
在我的示例中StateCache实现了Cache<User>和Cache<Settings>接口.现在不是两个方法都返回一个实例StateCache,我希望这两个方法显然都指向同一个实例.怎么能在Dagger得到这个?是否module保持引用的一个实例StateCache,并且两个方法都返回?
我有一个主要用Java编写的项目,但是我正在慢慢转移到Kotlin从事新活动。该项目应用了Dagger2,并且与基于Java的活动一起使用时,可以完美地工作。但是,当我创建Kotlin活动并尝试注入时,出现以下错误。
LoginIDPresenter没有@Inject构造函数或通过@Provides-或-带@Produces注释的方法不能提供。此类型支持成员注入,但不能隐式提供。
void inject(LoginIDActivity loginIDActivity);
com.maxis.mymaxis.ui.logindigitalid.LoginIDPresenter is injected at
com.maxis.mymaxis.ui.logindigitalid.LoginIDActivity.loginIDPresenter
com.maxis.mymaxis.ui.logindigitalid.LoginIDActivity is injected at
com.maxis.mymaxis.injection.component.ActivityComponent.inject(loginIDActivity)
Run Code Online (Sandbox Code Playgroud)
再次重申一下,当我在Java活动中进行注入时,它可以完美地工作。另外,我的Module和Component文件全部使用Java。仅当我创建Kotlin活动并尝试在其中进行注入时,我才会收到错误。
LoginIDPresenter.kt
class LoginIDPresenter : BasePresenter<LoginIDMvpView>() {
lateinit var mContext : Context
@Inject
fun LoginIDPresenter(@ActivityContext context: Context){
mContext = context
}
override fun attachView(loginIDMvpView: LoginIDMvpView) {
super.attachView(loginIDMvpView)
}
override fun detachView() {
super.detachView()
mCompositeSubscription.clear()
}
}
Run Code Online (Sandbox Code Playgroud)
LoginIDActivity.kt
class LoginIDActivity : BaseActivity(), LoginIDMvpView {
@Inject lateinit var loginIDPresenter : LoginIDPresenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
loginIDPresenter.attachView(this)
}
override …Run Code Online (Sandbox Code Playgroud)