[英]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.