我需要将NetReceiver
对象的创建注入到我的片段中,但是出现以下错误:
错误:[Dagger / MissingBinding] com.example.myapp.NetReceiver.OnNetCallback在没有@Provides注释的方法的情况下无法提供。
让我告诉你我尝试过的。这是我的NetReceiver
类:
public class NetReceiver extends BroadcastReceiver {
private OnNetCallback onNetCallback;
@Inject
public NetReceiver(OnNetCallback onNetCallback) {
this.onNetCallback = onNetCallback;
}
@Override
public void onReceive(Context context, Intent intent) {
if (someCondition) {
onNetCallback.enableOperation(true);
}
}
public interface OnNetCallback {
void enableOperation(boolean isOk);
}
}
如您所见,我想在构造函数中注入一个NetCallback
对象。我还创建了一个看起来像这样的Module类:
@Module
public abstract class NetReceiverModule {
@ContributesAndroidInjector //Error?!?!?!?!
abstract NetReceiver.OnNetCallback provideOnNetCallback();
@Singleton
@Provides
static NetReceiver provideNetReceiver(NetReceiver.OnNetCallback onNetCallback) {
return new NetReceiver(onNetCallback);
}
}
这是我的片段工作时的样子:
public class MapFragment extends Fragment implements NetReceiver.OnNetCallback {
private NetReceiver netReceiver;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Inflate View
netReceiver = new NetReceiver(this); //Worked
}
@Override
public void onResume() {
super.onResume();
mainActivity.registerReceiver(netReceiver, intentFilter);
}
@Override
public void onPause() {
super.onPause();
mainActivity.unregisterReceiver(netReceiver);
}
}
这是它不工作时的外观:
public class MapFragment extends DaggerFragment implements NetReceiver.OnNetCallback {
@Inject NetReceiver netReceiver;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Inflate View
//netReceiver = new NetReceiver(this); //Worked
}
@Override
public void onResume() {
super.onResume();
mainActivity.registerReceiver(netReceiver, intentFilter);
}
@Override
public void onPause() {
super.onPause();
mainActivity.unregisterReceiver(netReceiver);
}
}
Dagger2
无法做魔术。如何知道从哪里提供OnNetCallback
。您的片段扩展了该回调,但是既不使用@Inject
注释对它的构造函数进行注释(因为不建议您创建显式的片段构造器),也不在模块中使用@Provides
注释的方法提供它,也不使用OnNetCallback
进行绑定。 C0]通过MapFragment
带注释的方法,当您尝试将这样的接口与@Bind
一起注入时,这是“必须存在的”。但这不是主要问题。
即使您将设法正确地完成所有先前的工作,由于仍然存在循环依赖性,它仍然将不起作用-@Qualifier
取决于MapFragment
,NetReceiver
取决于NetReceiver
,OnNetCallback
是OnNetCallback
,因此MapFragment
取决于NetReceiver
。匕首不会让你这样做。
如果您希望您的MapFragment
实现MapFragment
,我建议如下:
OnNetCallback
如果要注入它,请从public class NetReceiver extends BroadcastReceiver { public OnNetCallback onNetCallback; @Override public void onReceive(Context context, Intent intent) { if (someCondition && onNetCallback!= null) { onNetCallback.enableOperation(true); } } public interface OnNetCallback { void enableOperation(boolean isOk); } } public class MapFragment extends DaggerFragment implements NetReceiver.OnNetCallback { @Inject NetReceiver netReceiver; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //Inflate View netReceiver.onNetCallback = this } @Override public void onResume() { super.onResume(); mainActivity.registerReceiver(netReceiver, intentFilter); } @Override public void onPause() { super.onPause(); mainActivity.unregisterReceiver(netReceiver); } }
的Fragment
实现中创建一些单独的文件,并在模块中@Provide,然后将其注入片段中。也
OnNetCallback
应用于喷射器,但不能用于注射者-它告诉@ContributesAndroidInjector
此类应注入一些用Dagger
,@Inject
和@Provides
注释描述的内容。此外,我建议您阅读有关
@Bind
和official guide的Dagger2
。希望有帮助。