How to inject into an AppWidgetProvider() in java using dagger 2 - Android

40 Views Asked by At

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

0

There are 0 best solutions below