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

AnZ*_*AnZ 2 android dependency-injection dagger dagger-2

我正在研究Dagger 2库并遇到了传递参数的问题,这些参数无法从"extends Application"类中获得.

例如,我需要传递FragmentManagerViewPager适配器构造函数.你会怎么做?

我的应用程序:

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)