I am using dagger 2 (version 2.37) and java in my android project. I want to inject ApiService to a class that extends AppWidgetProvider (which is a BroadcastReceiver). I followed steps on this reference , but it seems the AndroidInjection.inject(this, context) keeps return null on my AppWidgetProvider class when i tried to Log it.
Here's my ApiModule:
@Module
public class ApiModule {
Context context;
public ApiModule(Context context) {
this.context = context;
}
@Singleton
@Provides
public OkHttpClient provideClient() {
//Some HTTP Config
}
@Provides
public Retrofit provideRetrofit(OkHttpClient client) {
return new Retrofit.Builder()
.baseUrl(AppConfig.getBaseUrl())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
}
@Provides
public ApiInterface provideApiClient() {
return provideRetrofit(provideClient()).create(ApiInterface.class);
}
@Singleton
@Provides
public ApiSource provideApiSource(//Some params) {
return new ApiHelper(//Some params);
}}
My WidgetModule
public abstract class WidgetModule {
Context context;
@ContributesAndroidInjector
abstract BalanceWidgetProvider contributeBalanceWidgetProvider();
}
My ApplicationComponent:
@Singleton
@Component(modules = {ApplicationModule.class, ApiModule.class, WidgetModule.class})
public interface ApplicationComponent {
void inject(Object object);
//other implementation
}
And here's my BaseApp
public class BaseApp extends Application implements HasAndroidInjector{
private ApplicationComponent mApplicationComponent;
@Inject DispatchingAndroidInjector<Object> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
// inject Dagger 2
// Application Module (context , shared preference)
// API Module (Retrofit2)
mApplicationComponent = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.apiModule(new ApiModule(this))
//other module
.build();
mApplicationComponent.inject(this);
}
public ApplicationComponent getComponent() {
return mApplicationComponent;
}
public void setComponent(ApplicationComponent applicationComponent) {
mApplicationComponent = applicationComponent;
}
@Override
public AndroidInjector<Object> androidInjector() {
return dispatchingAndroidInjector;
}
}
Notes: There's a simplification of HasAndroidInjector implementation since dagger ver 2.23 (links)
And here's class that extends AppWidgetProvider (Kotlin)
class BalanceWidgetProvider : AppWidgetProvider() {
@Inject
lateinit var apiInterface: ApiInterface
override fun onReceive(context: Context?, intent: Intent?) {
//this line always return null
AndroidInjection.inject(this, context)
super.onReceive(context, intent)
apiInterface.getSomething()
}
@RequiresApi(Build.VERSION_CODES.N)
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {
val currentWidget = BalanceWidget(context,
appWidgetManager,
appWidgetId,
R.layout.balance_widget)
currentWidget.updateAppWidget()
}
}
}
Is there a step i might be missing? Thanks