首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AppWidgetProvider与dagger2

AppWidgetProvider与dagger2
EN

Stack Overflow用户
提问于 2017-11-14 18:04:18
回答 1查看 1.9K关注 0票数 1

我尝试将Dagger2与AppWidgetProvider结合使用。但我的豆子从来没有用匕首注射过。

我从示例开始:https://github.com/googlesamples/android-architecture-components/tree/master/GithubBrowserSample

我的AppModule:

代码语言:javascript
复制
@Module
public class AppModule {

    @Provides
    @Singleton
    Context providesApplicationContext(Application application) {
        return application;
    }

    @Singleton @Provides
    MyDb provideDb(Application app) {
        return Room.databaseBuilder(app, MyDb.class,"my.db")
                .build();
    }

    @Provides
    @Singleton
    SharedPreferences providesSharedPreferences(Application application) {
        return PreferenceManager.getDefaultSharedPreferences(application);
    }
}

我的WeatherModule

代码语言:javascript
复制
@Module
public class WeatherModule {

    @Singleton @Provides
    public OpenWeatherMapService provideOpenWeatherMapService() {
        return new Retrofit.Builder()
                .baseUrl(BuildConfig.OPEN_WEATHER_MAP_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(new LiveDataCallAdapterFactory())
                .build()
                .create(OpenWeatherMapService.class);
    }

    @Singleton @Provides
    public WeatherDao provideWeatherDao(MyDb db) {
        return db.weatherDao();
    }
}

我的Widget Dagger组件:

代码语言:javascript
复制
@Singleton
@Component(modules = {AppModule.class, WeatherModule.class})
public interface WeatherWidgetComponent {
    void inject(Context context);
}

我的申请:

代码语言:javascript
复制
public class MyApplication extends Application implements HasActivityInjector {

    @Inject
    DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;

    private WeatherWidgetComponent weatherWidgetComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        
        AppInjector.init(this);

        weatherWidgetComponent = DaggerWeatherWidgetComponent.builder()
                .build();
    }

    public WeatherWidgetComponent getWeatherWidgetComponent() {
        return weatherWidgetComponent;
    }

    @Override
    public DispatchingAndroidInjector<Activity> activityInjector() {
        return dispatchingAndroidInjector;
    }
}

我的AppWidgetProvider

代码语言:javascript
复制
public class WeatherAppWidgetProvider extends AppWidgetProvider {


    @Inject
    WeatherDao weatherDao;

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        inject(context);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        inject(context);

        for (int widgetId : appWidgetIds) {
            updateUI(appWidgetManager, context, widgetId);
        }
    }

    @Override
    public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
        super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
        inject(context);
        updateUI(appWidgetManager, context, appWidgetId);
    }

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        inject(context);
    }

    private void inject(Context context){
        Timber.d("inject");
        if(weatherDao ==null) {
            Timber.d("null so try to inject");
            ((MyApplication) context.getApplicationContext()).getWeatherWidgetComponent().inject(context);
        }
    }

    private void updateUI(AppWidgetManager appWidgetManager, Context context, int appWidgetId){
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.weather_widget);

        if(weatherDao ==null){
            Timber.d("weatherDao null");
        }
    }
}

在logcat中,我总是有:

11-14 18:41:43.494 38123812 D WeatherAppWidgetProvide:注射 11-14 18:41:43.495 38123812D WeatherAppWidgetProvide: null所以尝试注入 11-14 18:41:43.198 38123812 D WeatherAppWidgetProvide: weatherDao null

EN

回答 1

Stack Overflow用户

发布于 2017-11-14 18:16:22

正如Gabor在注释中指出的那样,您必须为字段注入指定一个具体的类。

代码语言:javascript
复制
@Singleton
@Component(modules = {AppModule.class, WeatherModule.class})
public interface WeatherWidgetComponent {
    void inject(Context context);
}

注入Context不会做任何事情,因为Context没有任何@Inject注释字段。生成的代码基本上会尝试注入上下文而什么也不做。

如果要用void inject(Context context)替换对void inject(WeatherAppWidgetProvider provider)的调用,Dagger将生成适当注入WeatherAppWidgetProvider的代码,而调用.inject(this)实际上会做一些事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47292472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档