Room、Kotlin、Dagger 2.15 android.app.Application在没有@Inject构造函数或@Provides注释方法的情况下无法提供

Room、Kotlin、Dagger 2.15 android.app.Application在没有@Inject构造函数或@Provides注释方法的情况下无法提供,android,kotlin,dagger-2,android-room,dagger,Android,Kotlin,Dagger 2,Android Room,Dagger,我有以下使用dagger for Room模块的实现。这会导致在ViewModel类中注入RoomMoule时出错。 以下是我的代码: 应用程序 class App : DaggerApplication(), HasActivityInjector { @Inject lateinit var activityDispatchInjector: DispatchingAndroidInjector<Activity> override fun applicationInject

我有以下使用dagger for Room模块的实现。这会导致在
ViewModel
类中注入
RoomMoule
时出错。 以下是我的代码:

应用程序

class App : DaggerApplication(), HasActivityInjector {

@Inject
lateinit var activityDispatchInjector: DispatchingAndroidInjector<Activity>

override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
    return DaggerAppComponent.builder().create(this)
}


override fun activityInjector(): DispatchingAndroidInjector<Activity> {
    return activityDispatchInjector
}
}
RoomModule

@Module
class AppModule {

@Provides
@Singleton
fun providesContext(app: Application): Context = app
}
@Module
class RoomModule {

@Singleton
@Provides
fun provideAppDatabase(context: Context): AppRoomDataBase =
        Room.databaseBuilder(context,
                AppRoomDataBase::class.java, "sample.db")
                .build()


@Singleton
@Provides

fun provideRepository(appRoomDataBase: AppRoomDataBase): ResultRepository {
    return ResultRepository(appRoomDataBase)
}    
}

AppComponent

@Singleton
@Component(modules = [
(AndroidSupportInjectionModule::class),
(AppModule::class),
(ActivityModule::class),
(FragmentModule::class),
(ViewModelModule::class),
(RoomModule::class)])
interface AppComponent : AndroidInjector<App> {

@Component.Builder
abstract class Builder : AndroidInjector.Builder<App>()
}
@Singleton
@组件(模块=[
(AndroidSupportInjectionModule::class),
(AppModule::class),
(活动模块::类),
(FragmentModule::class),
(ViewModelModule::class),
(RoomModule::class)])
接口组件:AndroidJector{
@组件生成器
抽象类生成器:androidject.Builder()
}
HomeViewModel

class HomeViewModel @Inject constructor() : ViewModel() {

@Inject lateinit var resultRepository: ResultRepository

private var liveList: LiveData<List<Result>>? = null

fun getResults(): LiveData<List<Result>>? {

     liveList = resultRepository.findAll()

    return liveList
  }
}
class HomeViewModel@Inject构造函数():ViewModel(){
@注入lateinit var resultRepository:resultRepository
私有变量liveList:LiveData?=null
有趣的getResults():LiveData{
liveList=ResultPresository.findAll()
返回直播列表
}
}
ResultRepository

class ResultRepository(appRoomDB : AppRoomDataBase) {

val mAppDb : AppRoomDataBase = appRoomDB

fun findAll(): LiveData<List<Result>> {
    return mAppDb.resultDao().getAll()
}
}
class ResultRepository(appRoomDB:AppRoomDataBase){
val mAppDb:appromdatabase=appromdb
fun findAll():LiveData{
返回mAppDb.resultDao().getAll()
}
}
在构建这个时,我得到的错误是

AppComponent.java:11: error: [dagger.android.AndroidInjector.inject(T)] 
android.app.Application cannot be provided without an @Inject constructor or 
from an @Provides-annotated method.
public abstract interface AppComponent extends 
dagger.android.AndroidInjector<com.dailypay.base.App> {
            ^
  android.app.Application is injected at
      com.dailypay.di.AppModule.providesContext(app)
  android.content.Context is injected at
      com.dailypay.di.RoomModule.provideAppDatabase(context)
  com.dailypay.room.AppRoomDataBase is injected at
      com.dailypay.di.RoomModule.provideRepository(appRoomDataBase)
  com.dailypay.repo.ResultRepository is injected at
      com.dailypay.ui.home.HomeViewModel.resultRepository
  com.dailypay.ui.home.HomeViewModel is injected at
      com.dailypay.di.ViewModelModule.bindMainViewModel(mainViewModel)
  java.util.Map<java.lang.Class<? extends android.arch.lifecycle.ViewModel>,javax.inject.Provider<android.arch.lifecycle.ViewModel>> is injected at
      com.dailypay.di.ViewModelFactory.<init>(creators)
  com.dailypay.di.ViewModelFactory is injected at
      com.dailypay.di.ActivityModule.bindViewModelFactory(factory)
  android.arch.lifecycle.ViewModelProvider.Factory is injected at
      com.dailypay.ui.home.HomeFragment.viewModelFactory
  com.dailypay.ui.home.HomeFragment is injected at
      dagger.android.AndroidInjector.inject(arg0)
AppComponent.java:11:错误:[dagger.android.androidjector.inject(T)]
如果没有@Inject构造函数或
从@提供带注释的方法。
公共抽象接口AppComponent扩展
匕首、安卓、雄激素注射器{
^
android.app.Application在
com.dailypay.di.AppModule.providesContext(应用程序)
android.content.Context在
com.dailypay.di.RoomModule.provideAppDatabase(上下文)
com.dailypay.room.AppRoomDataBase在
com.dailypay.di.RoomModule.provideRepository(appRoomDataBase)
com.dailypay.repo.ResultRepository在
com.dailypay.ui.home.HomeViewModel.resultRepository
com.dailypay.ui.home.HomeViewModel在
com.dailypay.di.ViewModelModule.bindMainViewModel(mainViewModel)

java.util.Map我已经提供了使用dagger 2的简单room DB演示,使用的代码如下,但这是可以轻松转换为kotlin的java代码

步骤1:为表定义pojo类,并定义@Entity注释类。 第2步:将该类定义为数据库类,如下所示

@Database(entities = {Hero.class, User.class}, version = 1)
public abstract class DemoDatabase extends RoomDatabase {

    public abstract HeroDao getHeroDao();

    public abstract UserDao getUserDao();

}
步骤3:为房间数据库定义模块类

@Module
public class RoomDbModule {

    private DemoDatabase demoDatabase;

    public RoomDbModule(Application application) {
        demoDatabase= Room.databaseBuilder(application,DemoDatabase.class,"DemoDb").allowMainThreadQueries().build();
    }

    @Provides
    @Singleton
    DemoDatabase getDemoDatabase(){
        return demoDatabase;
    }
}
步骤4:定义Dao类

@Dao
public interface HeroDao {
    @Insert
    void insertRecord(Hero hero);
}
步骤5:定义commpoent类

@Singleton
@Component(modules = {AppModule.class, NetModule.class, RoomDbModule.class, DbHelperModule.class})
public interface ApiComponent {
    void injectApi(MainActivity activity);

    void roomDb(InsertActivity insertActivity);

    void roomDb(PageingActivity pageingActivity);

    void dbHelper(AppCompatActivity appCompatActivity);
}
步骤6:将AppActivity定义为应用程序级别并传递到清单文件

public class AppActivity extends Application {
    private ApiComponent component;

    @Override
    public void onCreate() {
        super.onCreate();
        component = DaggerApiComponent.builder()
                .appModule(new AppModule(this))
                .roomDbModule(new RoomDbModule(this))
                .dbHelperModule(new DbHelperModule(new DbHelper(this, "UserDb", 1)))
                .netModule(new NetModule("https://api.github.com")).build();
    }

    public ApiComponent getComponent() {
        return component;
    }
}
并在下面使用的应用程序标记的清单文件中定义

        android:name=".app.AppActivity" // your activity name.
步骤7:Used Room db或inject..提供完整代码,以便使用Room将数据插入表中

public class InsertActivity extends BaseActivity {
    private EditText mEtName,mEtRealName,mEtTeamName;
    private Button mBtnInsert;

    @Inject
    DemoDatabase demoDatabase;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.insert_activity);
        ((AppActivity)getApplication()).getComponent().roomDb(this);
        initView();
    }

    private void initView() {
        mEtTeamName=findViewById(R.id.iaEtTeamName);
        mEtName=findViewById(R.id.iaEtName);
        mEtRealName=findViewById(R.id.iaEtRealName);
        mBtnInsert=findViewById(R.id.iaBtnInsert);
        mBtnInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                insertData();
            }
        });
    }

    private void insertData() {
        Hero hero=new Hero();
        hero.setName(mEtName.getText().toString().trim());
        hero.setRealname(mEtRealName.getText().toString().trim());
        hero.setTeam(mEtTeamName.getText().toString().trim());
        demoDatabase.getHeroDao().insertRecord(hero);
        Toast.makeText(getApplicationContext(),"Insert Successfully",Toast.LENGTH_SHORT).show();
        mEtRealName.setText("");
        mEtName.setText("");
        mEtTeamName.setText("");

    }
}

您的
AppComponent
缺少
生成器中的
@BindsInstance

@Component.Builder
interface Builder : AndroidInjector.Builder<App> {
    @BindsInstance Builder application(Application application);
    AppComponent build();
}
@Component.Builder
接口生成器:AndroidJector.Builder{
@BindsInstance Builder应用程序(应用程序);
AppComponent build();
}

发布您的
resultpository
代码…我想您需要在
resultpository
constructor上提供注入注释,或者认为dagger不知道如何提供(在何处找到)上下文。请尝试将include参数添加到模块:@module(includes=arrayOf(ModuleWithMethodProvideContext::class)).@Burhanuddin Rashid我尝试使用@inject构造函数,但我遇到了相同的错误…顺便说一句ResultReplicatoryadded@LvN您是否尝试过这个
类ResultRepository@Inject构造函数(appromdb:appromdatabase){..
?@Raghunandan是的,我试过了..得到了相同的错误..我相信当你需要房间db对象并访问任何方法时,会出现一些循环依赖,比如当时@Inject注释用于该类访问。我是dagger的新手-有人能解释为什么这被否决吗?我得到了以下错误`@BindsI@Components id中不应包含nstance方法。您的意思是将其放在@Component.Builder?public abstract dagger.android.androidjector.Builder应用程序(@org.jetbrains.annotations.NotNull()`正如您所见,我这里的
@BindsInstance
位于
@Component.Builder
中。