必须设置Dagger2 mvvm android模块

问题描述

我有一个关于android中的匕首的初学者级别的问题。请查看摘要快速掌握。
目的是通过依赖注入在我的视图模型类中提供CentralRepo实例。

说,我有以下具有依存关系的类,

Myviewmodel -> ctor( //initing.. mCentralRepo = CentralRepo.getInstance(RemoteRepo.getInstance) );

CentralRepo -> cror (@para RemoteRepo) 

现在,这些是我的模块类

  1. MyRemoteRepositoyModule

    @Module  
    public class MyRemoteRepositoryModule {  
    
     /**
      * Method to provide an instance of {@link RemoteRepository}
      *
      * @return RemoteRepository.
      */
     @Singleton 
     @Provides
     RemoteRepository provideRemoteRepository() {
         return RemoteRepository.getInstance();
     }
    }
    
  2. MyCentralRepositoryModule

     @Module  
     public class MyCentralRepositoryModule {  
     private RemoteRepository mRemoteRepository;
    
     public MyCentralRepositoryModule(RemoteRepository remoteRepository) {
         mRemoteRepository = remoteRepository;
     }
    
     /**
      * Method to provide an instance of {@link CentralRepository}
      *
      * @return MyCentralRepository.
      */
     @Singleton 
     @Provides
     MyCentralRepository provideMyCentralRepository() {
         return MyCentralRepository.getInstance(mRemoteRepository);
     }
    }
    
  3. 最后是组件类(IMyComponent)

      @Singleton
       @Component(modules = {MyRemoteRepositoryModule.class,MyCentralRepositoryModule.class})  
       public interface IMyComponent {
    
    
       /**
       * targeting injection in VM.
       */
       public void injectInviewmodel(MyAndroidviewmodel viewmodel);
    }
    

和应用程序类

public class MyApplication extends Application {
    
    private IMyComponent mComponent;

    @Override
    public void onCreate() {
        super.onCreate();
      
        // doubtful?
        mComponent = DaggerIMyComponent.builder().myRemoteRepositoryModule(new MyRemoteRepositoryModule()).build();
            
       //
    }
   }

现在,如果我尝试将其注入到视图模型类中 我遇到了错误

必须设置MyCentralRepositoryModule

我确信我错过了一些东西,如果您能指出错误,将不胜感激。

解决方法

您的IMyComponent定义您将只将这些模块注入MyAndroidViewModel中,并且您将在Application上下文中构建组件。现在有两种可能性。

1-将组件方法的参数从MyAndroidViewModel更改为Application

  @Singleton
  @Component(modules = {
      MyRemoteRepositoryModule.class,MyCentralRepositoryModule.class
  })  
  public interface IMyComponent {
      public void injectInViewModel(Application application);
  } 

然后使用此块

DaggerIMyComponent.builder().myCentralRepositoryModule(new MyRemoteRepositoryModule()).build().injectInViewModel(this);

2-或通过在类中添加以下代码在MyAndroidViewModel中构建组件

init{
DaggerIMyComponent.builder().myCentralRepositoryModule(new MyRemoteRepositoryModule()).build().injectInViewModel(this);
}