无法在Java Android中使用dagger2在片段中注入依赖项

时间:2018-11-29 10:17:09

标签: java android android-fragments dependency-injection dagger-2

我能够在活动及其工作中注入依赖性。但是在片段中调用相同的依赖项不会获得访问权限。

这就是我所做的。

App.Java

public class App extends MultiDexApplication implements HasActivityInjector, HasFragmentInjector {

    @Inject
    DispatchingAndroidInjector<Activity> activityInjector;

    @Inject
    DispatchingAndroidInjector<Fragment> fragmentInjector;

    private AppComponent mComponent;

    @Override
    public void onCreate() {
    super.onCreate();
    mComponent = DaggerAppComponent.builder().application(this).build();
    mComponent.inject(this);
    }

    @Override
    public DispatchingAndroidInjector<Activity> activityInjector() {
    return activityInjector;
    }

    @Override
    public AndroidInjector<Fragment> fragmentInjector() {
    return fragmentInjector;
    }
}

这是AppComponent.Java

@Singleton
@Component(modules = { AndroidInjectionModule.class, ActivityModule.class, FragmentModule.class})
public interface AppComponent extends AndroidInjector<App> {

    void inject(App app);

    @Component.Builder
    interface Builder {
    @BindsInstance
    Builder application(Application application);
    AppComponent build();
    }
}

这是ActivityModule.Java类

@Module
public abstract class ActivityModule {
    @ContributesAndroidInjector
    abstract MainActivity contributeMainActivityInjector();

    @ContributesAndroidInjector
    abstract MyActivity contributeCampaignActivityInjector();
}

这是FragmentModule.java类

@Module
public abstract class FragmentModule {
    @ContributesAndroidInjector
    abstract MyFragment bindMyFragment();
}

现在在我的MyFragment类中,我想在其中注入该依赖项。首先,我将这些行添加到类中

@Inject
ImageDownloaderApi imageDownloaderApi;

然后检查onCreateView函数,我这样做是为了检查我的依赖项是否像这样

boolean injected = imageDownloaderApi == null ? false : true;
    Log.d(this.getClass().getSimpleName(), "Dependency worked: "+ String.valueOf(injected));

而且每次都返回我为假。

同一代码在activites中起作用。 我在活动中要做的另一件事是像这样在onCreate下方添加此行

  @Override
protected void onCreate(Bundle savedInstanceState) {
    AndroidInjection.inject(this);    // this line
    super.onCreate(savedInstanceState);

当试图在片段的onCreateView中添加同一行时

AndroidInjection.inject(this);    

它在此下方显示红线。如果我用getActivity替换它。它给了我运行时错误。

请看看并指导我错了吗?

我正在处理片段的过程是否正确?因为它显然在活动中起作用。

提前感谢您的宝贵时间。

2 个答案:

答案 0 :(得分:2)

我假设您正在使用支持库中的Fragment-s。尝试将public class App extends MultiDexApplication implements HasActivityInjector, HasFragmentInjector更改为public class App extends MultiDexApplication implements HasActivityInjector, HasFragmentInjector, HasSupportFragmentInjector,并随后提供适当的注射器。

This is an easy article使该主题更清晰。另外,此处还介绍了HasSupportFragmentInjector接口的用法。

答案 1 :(得分:1)

  

当试图在片段的onCreateView中添加同一行时

     

AndroidInjection.inject(this);

这应该在片段的function getdetails() { // define URL var url = serverURL() + "/eventbyids.php"; // pass userid as JSON objects itemitemid = decodeURIComponent(getUrlVars()["eventid"]); var JSONObject = { "eventid": decodeURIComponent(getUrlVars()["eventid"]) }; // Call Ajax $.ajax({ url: url, type: 'GET', data: JSONObject, dataType: 'json', contentType: "application/json; charset=utf-8", success: function (arr) { **// this the part where i having the problem** $.ajax({ url: serverURL() + "/getorgname.php", type: 'GET', data: JSONObject1, dataType: 'json', contentType: "application/json; charset=utf-8", success: function (arr) { var orgname = arr[0].orgname; $('#detailsmain1').append(orgname); alert("123"); }, error: function () { alert("error45"); } }); var eventid = arr[0].eventid; var orgid = arr[0].userid; var eventname = arr[0].eventname; var JSONObject1 = { "userid": orgid }; }, error: function () { alert("error"); } }); 中完成,如果您正在使用支持库中的片段,则应该是onAttach

AndroidSupportInjection.inject(this)