Dagger 2 - ViewPagerAdapter

时间:2016-12-21 15:35:01

标签: android dagger-2

我不确定如何使用Dagger 2注射ViewPagerAdapter。也许我不需要使用此方法。

我有Activity,其中包含ViewPager,我希望Fragment中的其中一个ViewPager能够访问适配器,以便它可以动态更改ViewPager数。{/ p>

我遇到的主要问题是在使用@Inject并提供VerticalViewPagerAdapter时出现以下错误:

中尝试java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference后抛出的

super(fm)

public VerticalViewPagerAdapter(FragmentManager fm)
    {
        super(fm);
        userProgress = 1;
    }

如果没有@Provide并使用new进行实例化,我不会收到此错误。我认为它与getSupportFragmentManager()方法有关。

我的MainModule:

@Module
public class MainModule
{
    private final MyApplication app;

    public MainModule(MyApplicationapplication)
    {
        app = application;
    }

    @Provides
    @Singleton
    protected Application provideApplication()
    {
        return app;
    }

    @Provides
    @Singleton
    protected Resources provideResources()
    {
        return app.getResources();
    }

    @Provides
    @Singleton
    protected MainActivity provideMainActivity()
    {
        return new MainActivity();
    }

    @Provides
    @Singleton
    protected MainPresenter provideMainPresenter(MainActivity mainActivity)
    {
        return new MainPresenterImpl(mainActivity);
    }

    @Provides
    @Singleton
    protected VerticalViewPagerAdapter provideVerticalViewPagerAdapter(MainActivity mainActivity)
    {
        // This line here
        return new VerticalViewPagerAdapter(mainActivity.getSupportFragmentManager());
    }
}

1 个答案:

答案 0 :(得分:2)

我想这与您在模块中的以下方法中注入的MainActivity有关:

provideVerticalViewPagerAdapter(MainActivity mainActivity)

我是否可以建议使用作为MainActivity实例的Context初始化模块,以确保Context和FragmentManager可用,如下所示:

@Module
public class MainActivityModule {
    private final MainActivity myActivity;

    public MainActivityModule(MainActivity activity) {
        this.myActivity= activity;
    }

    @Provides
    @PerActivity
    protected VerticalViewPagerAdapter provideVerticalViewPagerAdapter() {
        return new VerticalViewPagerAdapter(myActivity.getSupportFragmentManager());
    }
}

然后当你注入时,你必须使用Activity的实例初始化模块,如下所示:

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     DaggerMainActivityComponent
         .builder() 
         .mainComponent(MyApplication.component())
         .mainActivityModule(new MainActivityModule(this))
         .build()
         .inject(this);
 }