如何使用Dagger2@InjectandroidViewModel?

如何使用Dagger2@InjectandroidViewModel?,android,dagger-2,android-viewmodel,Android,Dagger 2,Android Viewmodel,我目前正在调查我的Android应用程序中使用的Dagger2 implementation 'com.google.dagger:dagger:2.21' annotationProcessor 'com.google.dagger:dagger-compiler:2.21' implementation 'com.google.dagger:dagger-android:2.21' implementation 'com.google.dagger:dagger-android-suppo

我目前正在调查我的Android应用程序中使用的
Dagger2

implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'

implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
我已经成功地
@注入了
视图模型及其关联的存储库

使用以下代码:-

import java.util.Map;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;

import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;

@Singleton
public class DaggerViewModelFactory implements ViewModelProvider.Factory {

    private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;

    @Inject
    public DaggerViewModelFactory(final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
        this.creators = creators;
    }

    @SuppressWarnings("unchecked")
    @Override
    public <T extends ViewModel> T create(final Class<T> modelClass) {
        Provider<? extends ViewModel> creator = creators.get(modelClass);

        if (creator == null) {
            for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) {
                if (modelClass.isAssignableFrom(entry.getKey())) {
                    creator = entry.getValue();
                    break;
                }
            }
        }

        if (creator == null) {
            throw new IllegalArgumentException("unknown model class " + modelClass);
        }

        try {
            return (T) creator.get();
        } catch (final Exception e) {
            throw new RuntimeException(e);
        }
    }
}

import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;

@Module
public abstract class ViewModelModule {

    @Binds
    abstract ViewModelProvider.Factory bindViewModelFactory(final DaggerViewModelFactory factory);

    @Binds
    @IntoMap
    @ViewModelKey(StilettoViewModel.class)
    abstract ViewModel provideStilettoViewModel(final StilettoViewModel stilettoViewModel);
}
还有这个匕首模块

import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.ViewModelProvider;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;

@Module
public abstract class ViewModelModule {

    @Binds
    abstract ViewModelProvider.AndroidViewModelFactory bindAndroidViewModelFactory(final DaggerAndroidViewModelFactory factory);

    @Binds
    @IntoMap
    @ViewModelKey(MyAndroidViewModel.class)
    abstract AndroidViewModel provideArticlesViewModel(final ArticlesViewModel articlesViewModel);
}
当我遇到此错误时,将不会生成此代码

error: [Dagger/MissingBinding] MyAndroidViewModel cannot be provided without an @Inject constructor or an @Provides-annotated method.
是否可以使用Dagger2注入
androidx.lifecycle.AndroidViewModel


我的实现哪里出了问题?

如果您有一个
@模块
,它提供
应用程序
(或者您使用
@BindsInstance
+
@Component.Builder
,或者可以正常工作):

然后,现在不再使用AndroidViewModel:

public class MyViewModel extends AndroidViewModel {
    public MyViewModel(Application app) {
        ...
    }
}
您可以将常规ViewModel与
@Inject
构造函数一起使用:

public class MyViewModel extends ViewModel {
    @Inject
    MyViewModel(Application app) {
        ...
    }
}

通过您的
DaggerViewModelFactory
将ViewModel对象注入刀柄,您可以像使用任何其他常规ViewModel类一样使用它。 阅读更多关于

将构造函数注释为
ViewModelInject
,它是提供视图模型工厂的

@AndroidEntryPoint
class HomeFragment : Fragment() {

    private val homeViewModel: HomeViewModel by viewModels()
}
视图模型类为:

class HomeViewModel @ViewModelInject constructor(
    authorizationRepository: AuthorizationRepository
) : ViewModel()
将以下附加依赖项添加到Gradle文件中

implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'

问题是关于AndroidViewModel的。如果扩展AndroidViewModel,则需要将应用程序注入ViewModel中。
@AndroidEntryPoint
class HomeFragment : Fragment() {

    private val homeViewModel: HomeViewModel by viewModels()
}
class HomeViewModel @ViewModelInject constructor(
    authorizationRepository: AuthorizationRepository
) : ViewModel()
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'