Dagger 2 - 将 FragmentManager 传递给构造函数

Dagger 2 - Pass FragmentManager to constructor

我正在研究 Dagger 2 库,遇到无法从 "extends Application" class 获取的参数传递问题。

例如,我需要将 FragmentManager 传递给 ViewPager 适配器构造函数。 你会怎么做?

我的应用程序:

public class MyApplication extends Application {

private MyAppComponent mMyAppComponent;

@Override
public void onCreate() {
    super.onCreate();

    Context context = getApplicationContext();

    mMyAppComponent= DaggerMyAppComponent.builder()
            .utilityModule(new UtilityModule())
            .locationModule(new LocationModule(context))
            .appModule(new AppModule(context))
            .pagerAdapterModule(new PagerAdapterModule(context)) //this one is problematic
            .build();
}

public MyAppComponent getmMyAppComponent() {
    return mMyAppComponent;
    }
}

MyAppComponent:

@Singleton
@Component(
    modules = {
            UtilityModule.class,
            LocationModule.class,
            PagerAdapterModule.class,
            AppModule.class
    }

)

public interface MyComponent {
    FragmentManager fragmentManager(); //is it right?

    public void inject(NavigationActivity navigationActivity);
}

AppModule:

@Module
public class AppModule {
Context context;

public AppModule(Context context) {
    this.context = context;
}

@Provides
@Singleton
Context provideApplicationContext() {
    return context;
    }
}

PagerAdapterModule:

@Module
public class PagerAdapterModule {
Context context;

public PagerAdapterModule(Context context) {
    this.context = context;
}

@Provides
@Singleton TabsPagerAdapter provideTabsPagerAdapter(FragmentManager fragmentManager) {
    return new TabsPagerAdapter(context, fragmentManager);
    }
}

NavigationActivity:

@Inject TabsPagerAdapter mTabsAdapter; //I want this to be initialized 

您可以将 FragmentManager 传递给 PagerAdapterModule:

Context context;
FragmentManager fragmentManager;

public PagerAdapterModule(Context context, FragmentManager fragmentManager) {
    this.context = context;
    this.fragmentManager = fragmentManager;
}

您需要FragmentActivity才能获得FragmentManager,这意味着您无法在Application级别完成它,因为它太快了。所以你必须从 AppComponent 创建一个组件依赖,我们将其命名为 ActivityComponent,它将看到 AppComponent 提供的所有依赖。

@Component(modules = ActivityModule.class, dependencies = MyAppComponent.class)
public interface ActivityComponent {
    void inject(MainActivity mainActivity);
}

@Module
public class ActivityModule {

    FragmentActivity activity;

    public ActivityModule(FragmentActivity activity) {
        this.activity = activity;
    }

    @Provides
    TabsPagerAdapter provideTabsPagerAdapter() {
        return new TabsPagerAdapter(activity, activity.getSupportFragmentManager());
    }
}

现在在您的 activity 的 onCreate() 中:

public class MainActivity extends AppCompatActivity {

    @Inject
    TabsPagerAdapter tabsPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActivityComponent activityComponent = DaggerActivityComponent.builder()
                                                .activityModule(new ActivityModule(this))
                                                .myAppComponent(MyApplication.getMyAppComponent())
                                                .build();

        activityComponent.inject(this);
    }

}

我有这个 viewPagerAdapter 的构造函数和注入的片段

@Inject
DashboardFragment dashboardFragment;

@Inject
public HomeViewPageAdapter(FragmentManager fragmentManager) {
    super(fragmentManager , BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    MyApplication.component.inject(this);
}

并创建此模块

        @Module
public class HomeActivityModule {

    @Provides
    HomeViewPageAdapter provideHomeViewPageAdapter(HomeActivity homeActivity) {
        return new HomeViewPageAdapter(homeActivity.getSupportFragmentManager());
    }
}

并提供 HomeActivity

        @Module
public class HomeActivityModule {

    @Provides
    HomeViewPageAdapter provideHomeViewPageAdapter(HomeActivity homeActivity) {
        return new HomeViewPageAdapter(homeActivity.getSupportFragmentManager());
    }
}

终于在HomeActivity中可以像这样注入viewPagerAdapter了

@Inject
HomeViewPageAdapter homeViewPageAdapter;