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;
我正在研究 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;