簡體   English   中英

使用匕首注射活動

[英]Inject activity using dagger

我嘗試用dvger 2使用mvp和RXAndroid創建示例應用程序,每個東西都能正常工作但是我無法注入Activity以下是我的AppComponent

@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
    void inject(App app);

    void inject(MainActivity activity);

    void inject(ResponseService service);

    void inject(MainPresenter presenter);
}

以下是我的模塊

@Module
public class AppModule {

    private App app;
    public AppModule(App app) {
        this.app = app;
    }
    private static final String API_ENDPOINT = "url here";

    @Provides
    @Singleton
    public ApiService apiService() {
        OkHttpClient client = new OkHttpClient();


        Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ClassTypeAdapterFactory())
                .registerTypeAdapter(Class.class, new ClassTypeAdapter()).create();


        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API_ENDPOINT)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(client)
                .build();

        return retrofit.create(ApiService.class);
    }

    @Provides
    @Singleton
    ResponseService responseService() {
        return new ResponseService(app.getComponent());
    }

    @Provides
    @Singleton
    MainPresenter mainPresenter() {
        return new MainPresenter(app.getComponent());
    }

    @Provides
    @Singleton
    EventBus eventBus() {
        return EventBus.getDefault();
    }
}

我正確注入所有東西並且可以使用它們除了ManiActivity時嘗試使用它給我空指針以下我如何注入它

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ((App) getApplicationContext())
            .getComponent()
            .inject(this);

    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    initRecyclerView();
    presenter.setView(this);
}

但是當我嘗試在我的適配器中將它用作Context並將其傳遞給Picasso庫時,請給我以下異常java.lang.IllegalArgumentException: Context must not be null. 以下是我如何使用它

@Inject
MainActivity activity;

並在onBindViewHolder中使用它如下

Picasso.with(activity).load(response).fit().into(holder.ivCover);

我的適配器代碼

public class ReAdapter extends RecyclerView.Adapter<ReAdapter.RViewHolder> {
    private List<Response> responseList;

    @Inject
    MainActivity appContext;


    public ReAdapter() {
    }

    public void setResponseList(List<Response> responseList) {
        this.responseList = responseList;
        notifyDataSetChanged();
    }

    @Override
    public RViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.response_item, parent, false);
        return new RViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RViewHolder holder, int position) {
        final Response response = responseList.get(position);
            Picasso.with(appContext).load(response.getValue().toLowerCase()).fit().into(holder.ivd);
    }

    @Override
    public int getItemCount() {
        return responseList != null ? responseList.size() : 0;
    }


    public class RViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.ivd)
        ImageView ivd;

        public RViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, itemView);
        }
    }
}

任何人都可以幫我解決這個問題嗎?

  • 您的活動: MainActivity沒有@Inject注釋的構造函數(並且不能有,因為它是由系統創建的)。
  • AppModule中沒有返回MainActivity @Provides注釋方法。
  • 您正在注入活動中的字段而不是適配器中的字段。

結果是Dagger不知道如何創建MainActivity類型的對象。

針對此特定問題的解決方案是使用Picasso的應用程序上下文,或者甚至使用Dagger更好地創建Picasso對象。

使用以下命令更新AppModule

@Provides
@Singleton
Picasso providePicasso(App app) {
    return Picasso.with(app);
}

MainActivity添加一個字段:

@Inject
ReAdapter adapter;

ReAdapter修改構造函數並為picasso添加一個字段:

private final Picasso picasso;

@Inject
public ReAdapter(Picasso picasso) {
    this.picasso = picasso;
}

這樣Dagger可以創建一個單身Picasso實例。 ReAdapter使用@Inject注釋(使用構造函數注入),因此Dagger知道如何創建它。 通過在MainActivity調用component.inject(this)MainActivity添加ReAdapter字段,將初始化適配器字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM