Проблема в том, что Dagger2
не может творить магию. Как следует знать, откуда предоставить OnNetCallback
. Ваш фрагмент расширяет этот обратный вызов, но ни его конструктор не аннотирован @Inject
аннотацией (потому что вам не рекомендуется создавать явные конструкторы фрагментов), ни он не снабжен аннотированным методом @Provides
в вашем модуле, а OnNetCallback
не связан с 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
реализацию OnNetCallback
и @ предоставьте ее в модуле и вставьте ее во фрагмент.
Также @ContributesAndroidInjector
следует использовать для инжекторов, но не для инжекторов - это говорит Dagger
что этот класс должен быть добавлен с некоторыми вещами, описанными с аннотациями @Inject
, @Provides
и @Bind
.
Также я бы порекомендовал вам прочитать официальное руководство относительно Dagger2
и его использования для Android .
Надеюсь, это поможет.