【问题标题】:RequestQueue cannot be provided without an inject constructor没有注入构造函数就无法提供 RequestQueue
【发布时间】:2018-03-15 14:02:31
【问题描述】:

我正在尝试从这篇中等文章中学习 Dagger2 并将 RequestQueue 作为活动级别依赖项传递: https://proandroiddev.com/dagger-2-annotations-binds-contributesandroidinjector-a09e6a57758f 我可以很好地创建应用程序组件,但我在使用 ContributesAndroidInjector 时遇到了很多麻烦。 应用类:

public class PokemonApplication extends Application {
    private static AppComponent appComponent;
    public static AppComponent getAppComponent(){
        return appComponent;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        appComponent=buildMyComponent();
    }

    private AppComponent buildMyComponent() {
        return DaggerAppComponent.builder().appmod(this).build();
    }


}

应用模块:

 @Module
    public abstract   class AppModule {
        @ContributesAndroidInjector(modules = VolleyModule.class)
        abstract MainActivity mainActivity();


        @Provides
        @Singleton
         static SharedPreferences providePreferences(Application application) {
            return application.getSharedPreferences("data", Context.MODE_PRIVATE);
        }
        @Provides
        @Singleton
        static Context getContext(Application application){
            return application.getApplicationContext();
        }

    }

应用组件:

@Singleton
@Component(modules = {RetrofitModule.class,AppModule.class})
public interface AppComponent {

    void inject(MainActivity mainActivity); //Error here.

    @Component.Builder
    interface Builder
    {
        AppComponent build();
        @BindsInstance Builder appmod(Application application);


    }

}

VolleyModule:

@Module
public abstract class VolleyModule {


    @Provides
    static RequestQueue getRequestQueue(Context context) {
        return Volley.newRequestQueue(context);
    }
}

主活动:

 @Inject
    RequestQueue requestQueue;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PokemonApplication.getAppComponent().inject(this);

【问题讨论】:

    标签: android dependency-injection dagger-2


    【解决方案1】:

    VolleyModule 也必须在 Component 的模块列表中声明

      @Singleton
      @Component(modules = {RetrofitModule.class,AppModule.class, VolleyModule.class})
    

    【讨论】:

    • 谢谢,解决了。你能告诉我我在 AppModule 中声明的抽象方法 mainActivity 在哪里吗?
    • PokemonApplication.getAppComponent().inject(this);MainActivity 完成的吗?
    猜你喜欢
    • 2023-03-26
    • 2018-05-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多