AnZ*_*AnZ 2 android dependency-injection dagger dagger-2
我正在研究Dagger 2库并遇到了传递参数的问题,这些参数无法从"extends Application"类中获得.
例如,我需要传递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;
}
}
Run Code Online (Sandbox Code Playgroud)
MyAppComponent:
@Singleton
@Component(
modules = {
UtilityModule.class,
LocationModule.class,
PagerAdapterModule.class,
AppModule.class
}
Run Code Online (Sandbox Code Playgroud)
)
public interface MyComponent {
FragmentManager fragmentManager(); //is it right?
public void inject(NavigationActivity navigationActivity);
}
Run Code Online (Sandbox Code Playgroud)
的AppModule:
@Module
public class AppModule {
Context context;
public AppModule(Context context) {
this.context = context;
}
@Provides
@Singleton
Context provideApplicationContext() {
return context;
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
NavigationActivity:
@Inject TabsPagerAdapter mTabsAdapter; //I want this to be initialized
Run Code Online (Sandbox Code Playgroud)
azi*_*ian 10
你需要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());
}
}
Run Code Online (Sandbox Code Playgroud)
现在进入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);
}
}
Run Code Online (Sandbox Code Playgroud)