如何使用Dagger2在Fragment中注入BroadcastReceiver对象的创建?

问题描述 投票:0回答:1

我需要将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);
    }
}
android dependency-injection broadcastreceiver dagger-2 dagger
1个回答
0
投票
问题是Dagger2无法做魔术。如何知道从哪里提供OnNetCallback。您的片段扩展了该回调,但是既不使用@Inject注释对它的构造函数进行注释(因为不建议您创建显式的片段构造器),也不在模块中使用@Provides注释的方法提供它,也不使用OnNetCallback进行绑定。 C0]通过MapFragment带注释的方法,当您尝试将这样的接口与@Bind一起注入时,这是“必须存在的”。

但这不是主要问题。

即使您将设法正确地完成所有先前的工作,由于仍然存在循环依赖性,它仍然将不起作用-@Qualifier取决于MapFragmentNetReceiver取决于NetReceiverOnNetCallbackOnNetCallback,因此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注释描述的内容。

此外,我建议您阅读有关@Bindofficial guideDagger2

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.