【发布时间】:2019-11-07 11:03:34
【问题描述】:
我需要将 NetReceiver 对象的创建注入我的 Fragment 但我收到以下错误:
错误:[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);
}
}
【问题讨论】:
-
OnNetCallback是一个接口,通过定义abstract NetReceiver.OnNetCallback provideOnNetCallback();dagger 不知道要返回哪个实现。你想做的是@Binds abstract fun bindOnNetCallback(callback: MapFragment): OnNetCallback。但我不会这样设计,所以我必须在广播接收器中注入片段。也许你可以有一个交互器/存储库/本地数据源作为MapFragment和NetReceiver之间的连接 -
@sonnet 您能否提供一个答案,以便我更好地查看代码?谢谢
标签: android dependency-injection broadcastreceiver dagger-2 dagger