Search code examples
androiddagger

Android Java Dagger Inject Problems


My AppComponent

 @Singleton
 @Component(modules = {SplashModule.class})
   public interface AppComponent  {
     void inject(SplashActivity splashActivity);//this is inject activity
    
 }

Splash Module

@Module
public class SplashModule {

   @Provides
   @Singleton
   static SplashInteract provideSplashInteract(){
      return new SplashInteract();//instance interact
    };

   @Provides
   @Singleton
    SplashPresenter provideSplashPresenter(SplashInteract splashInteract){
      return new SplashPresenter(splashInteract);//instance SplashPresenter
     };
 }

Splash Presenter

 public class SplashPresenter implements ISplashContract.Presenter {

  ISplashContract.View mView;
 SplashInteract splashInteract;


public SplashPresenter(SplashInteract splashInteract) {
    this.splashInteract =splashInteract;
}

public void bindView(ISplashContract.View mView) {
    this.mView = mView;
}

   @Override
    public void attach() {

    this.mView.startAnimation();//start splash animation
  }

  @Override
   public void start(Activity activity) {
    this.splashInteract.SplashScreenAnimation(activity);// add interact methods
    }
 }

Splash Activity

 public class SplashActivity extends AppCompatActivity implements ISplashContract.View{

 @Inject SplashPresenter splashPresenter;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    getAppComponent().inject(this);//call BaseApp DaggerAppComponent 
    splashPresenter.attach();
    splashPresenter.bindView(this);
  }


    @Override
    public void startAnimation() {
    this.splashPresenter.start(this);
   }

 }

Base App

 public class BaseApp  extends Application {

 private  static AppComponent appComponent;

  @Override
  public void onCreate() {
    super.onCreate();
    setUp();
  }

   private void setUp() {
    appComponent = DaggerAppComponent.builder().build();//Call Component in BaseApp
   }

   public static AppComponent getAppComponent() {
    return appComponent;
   }
}

Hi Everyone

I am writing a project, I want to use dagger, but I am inexperienced at this. This code gives a NullPointerException error. I could not find what I am doing wrong.

I need help and I will be glad if those who know better than the dagger guide me


Solution

  • In your case, dagger will not know how to provide splashPresenter, either do a constructor Injection or define in the module how SplashPresenter should be created, and remove SpashPresenter from the Component. The module approach should be like so,

    @Module
    public class SplashModule {
    
     ISplashContract.View  mView;
    
       public SplashModule(ISplashContract.View mView) {
        this.mView = mView;//add SplashModule view
      }
    
      @Provides
      @Singleton
      public ISplashContract.View provideSplashPresenter(){
        return mView;//set this view
      }
    
       @Provides
       static SplashInteract provideSplashInteract(){
        return new SplashInteract();//instance interact 
      };
    
       @Provides
       SplashPresenter provideSplashPresenter(ISplashContract.View mView, SplashInteract splashInteract){
        return new SplashPresenter(mView, splashInteract);//instance SplashPresenter 
      };
    
     }
    

    And remove inject annotations from SplashPresenter and you will also have to change the signature for its constructor. You can optionally remove Singleton annotation from the code, if the presenter is not supposed to be singleton.

    Updates based on comments

    
     public class SplashModule {
    
       @Provides
       static SplashInteract provideSplashInteract(){
        return new SplashInteract();//instance interact 
      };
    
       @Provides
       SplashPresenter provideSplashPresenter(SplashInteract splashInteract){
        return new SplashPresenter(splashInteract);//instance SplashPresenter 
      };
    
     }
     public class SplashPresenter implements ISplashContract.Presenter {
    
       ISplashContract.View mView;
       SplashInteract splashInteract;
    
      public SplashPresenter(SplashInteract splashInteract) {
        this.splashInteract = splashInteract;
      }
    
      public void bindView(ISplashContract.View mView) {
        this.mView = mView;
      }
    
       @Override
        public void attach() {
    
        this.mView.startAnimation();//start splash animation
      }
    
      @Override
       public void start(Activity activity) {
        this.splashInteract.SplashScreenAnimation(activity);// add interact methods
        }
     }
    
    public class SplashActivity extends AppCompatActivity implements ISplashContract.View{
    
     @Inject SplashPresenter splashPresenter;
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        getAppComponent().inject(this);//call BaseApp DaggerAppComponent 
        splashPresenter.bind("the view you want to bind")
        splashPresenter.attach();
      }
    
    
        @Override
        public void startAnimation() {
        this.splashPresenter.start(this);
       }
    
     }```