0
votes

In my project, I use the Salut library to use the wi-fi direct. Below is the class constructor:

public Salut(SalutDataReceiver dataReceiver, 
             SalutServiceData salutServiceData, 
             SalutCallback deviceNotSupported) {
...
}

Class SalutDataReceiver as parameters takes a reference to activity. He also takes a callback. Below is the class constructor:

public SalutDataReceiver(Activity activity, SalutDataCallback dataCallback) {
}

Since there is a rigid link with activity, I assume that this object should be transferred from the outside. Below is the class of the module and component:

@Module
public class WifiCommunicationModule {

    public WifiCommunicationModule() {

    }

    @Provides
    @Singleton
    public Salut provideSalut(SalutDataReceiver dataReceiver) {
        SalutServiceData serviceData = new SalutServiceData("testService", 50489, "test");
        return new Salut(dataReceiver, serviceData, null);
    }
}


 @Singleton
 @Component(modules = {
            AppModule.class,
            WifiCommunicationModule.class
    })
    public interface MainComponent {
        void inject(MainActivity activity);
    }


public class MainActivity extends AppCompatActivity {

    @Inject
    Salut salut;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


    }
}

But at compilation throws an exception:

Error:(25, 10) error: com.peak.salut.SalutDataReceiver cannot be provided without an @Inject constructor or from an @Provides-annotated method. com.peak.salut.SalutDataReceiver is injected at com.test.modules.WifiCommunicationModule.provideSalut(dataReceiver) com.peak.salut.Salut is injected at com.test.views.activities.MainActivity.salut com.test.views.activities.MainActivity is injected at com.test.components.MainComponent.inject(activity)

UPDATE

Mr. @Zayniddin Mamarasulov recommended that you create a derived class from the SalutDataReceiver and mark the constructor as @Inject. But unfortunately this also does not work

public class SalutDataReceiverExtension extends SalutDataReceiver {

    @Inject
    public SalutDataReceiverExtension(Activity activity, SalutDataCallback dataCallback) {
        super(activity, dataCallback);
    }
}


@Module
public class WifiCommunicationModule {

    public WifiCommunicationModule() {

    }

    @Provides
    @Singleton
    public Salut provideSalut(SalutDataReceiverExtension dataReceiver) {
        SalutServiceData serviceData = new SalutServiceData("testService", 50489, "test");
        return new Salut(dataReceiver, serviceData, null);
    }
}

Error:(25, 10) error: android.app.Activity cannot be provided without an @Inject constructor or from an @Provides-annotated method. android.app.Activity is injected at com.test.implementation.SalutDataReceiverExtend.(activity, …) com.test.implementation.SalutDataReceiverExtend is injected at com.test.modules.WifiCommunicationModule.provideSalut(dataReceiver) com.peak.salut.Salut is injected at com.test.views.activities.MainActivity.salut com.test.views.activities.MainActivity is injected at com.test.components.MainComponent.inject(activity)

1

1 Answers

0
votes

Add @Inject annotation to SalutDataReceiver's constructor like this :

@Inject
public SalutDataReceiver(Activity activity, SalutDataCallback dataCallback) {
}