Java 使用匕首注入活动
我尝试使用mvp和RXAndroid使用dagger 2创建示例应用程序,每件事都正常工作,但我无法注入活动。以下是我的AppComponentJava 使用匕首注入活动,java,android,dagger-2,Java,Android,Dagger 2,我尝试使用mvp和RXAndroid使用dagger 2创建示例应用程序,每件事都正常工作,但我无法注入活动。以下是我的AppComponent @Singleton @Component(modules = {AppModule.class}) public interface AppComponent { void inject(App app); void inject(MainActivity activity); void inject(ResponseSe
@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);
}
但当尝试在适配器中将其用作上下文并将其传递给毕加索库时,会出现以下异常java.lang.IllegalArgumentException:Context不能为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);
}
}
}
公共类ReAdapter扩展了RecyclerView.Adapter{
私人名单负责人;
@注入
主活动和上下文;
公共读取器(){
}
公共无效集合响应列表(列表响应列表){
this.responseList=响应列表;
notifyDataSetChanged();
}
@凌驾
public RViewHolder onCreateViewHolder(最终视图组父级,最终int视图类型){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.response_项,parent,false);
返回新的RVIEWolder(视图);
}
@凌驾
BindViewHolder上的公共无效(RViewHolder holder,内部位置){
最终响应=响应列表get(位置);
将(response.getValue().toLowerCase()).fit()加载到(holder.ivd)中;
}
@凌驾
public int getItemCount(){
return responseList!=null?responseList.size():0;
}
公共类RViewHolder扩展了RecyclerView.ViewHolder{
@BindView(R.id.ivd)
图像视图ivd;
公共RVIEWolder(视图){
超级(视图);
ButterKnife.bind(这个,itemView);
}
}
}
有人能帮我解决这个问题吗?- 您的活动:
没有带MainActivity
注释的构造函数(并且不能有,因为它是由系统创建的)李>@Inject
- 在
中,没有AppModule
@提供返回
的带注释的方法MainActivity
- 您是在活动中而不是在适配器中注入字段
Dagger
不知道如何创建类型为MainActivity
的对象
此特定问题的解决方案是使用毕加索
的应用程序上下文,或者更好地使用匕首
创建一个毕加索
对象
使用以下内容更新您的AppModule
:
@Provides
@Singleton
Picasso providePicasso(App app) {
return Picasso.with(app);
}
在main活动中
添加一个字段:
@Inject
ReAdapter adapter;
在ReAdapter
中修改构造函数并为毕加索添加字段:
private final Picasso picasso;
@Inject
public ReAdapter(Picasso picasso) {
this.picasso = picasso;
}
通过这种方式,
Dagger
可以创建一个singletonPicasso
实例。ReAdapter
带有@Inject注释(使用构造函数注入),因此Dagger
知道如何创建它。调用组件时,通过在MainActivity
中添加ReAdapter
字段,在MainActivity
中注入(此)
,适配器字段将被初始化 您正在适配器中调用AppComponent.inject吗?请包括有问题的代码,描述您在何处注入/创建对象以及如何注入/创建对象,不要只显示一行代码。我猜您刚刚在代码中添加了一些@Inject
,不知道为什么什么都没发生?e、 g.仅在我的活动中查看@RafalMalek即使可以,您也不会希望注入活动。最多您需要注入一个上下文。您更喜欢使用应用程序上下文,而不是活动上下文。@DavidMedenjak检查更新的问题,并通过@Inject?@Ahmed更新了我的问题,解释了发生了什么。