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)