2

我有一个应用程序,比如说 15 个屏幕。有 3 个主要的、完全独立的活动:

  • LoginActivity- 很明显的一个,一些登录的东西
  • MainActivity- 最重要的,最重要的
  • TheOtherOneNotRelevantAtTheMoment

我决定使用Conductor,因为我发现 Fragment 的生命周期太复杂了,对我Conductor来说现在是“热狗屎”

我有很多指挥家的控制器。它们中的大多数都XXXListController与对应的XXXDetailController. 所有这些控制器都只存在于内部MainActivity。这有点像“单一活动应用程序”。LoginActivity主要是由于 FbLogin 和 Google Login 等第三方 OAuth 的回调而引入的。我只是想MainActivity完全属于我 - 没有任何其他奇怪的行为。

为了稍微组织依赖关系,我决定使用 Dagger2。我在 Spring 和 JavaEE 方面有很好的经验,所以我认为这很容易。

我认出了几个没有任何问题的模块:

AppModule- 与我的应用程序相关的东西,如服务器地址等 AndroidModule- 与类似的东西SharedPreferencesApplication

然后,我几乎“即兴创作”了如何组织我的观点。这就是我所拥有的:

  • 3 个附加范围:ActivityScopeControllerScopeServiceScope- 不相关。
  • 每个Controller都有自己对应的Module& Component。我读过这不是一个好主意,但我可以接受 - 每个Controller都是非常独立的,并且有自己独特的依赖项集。
  • ApplicationComponent当然是层次结构的根。
  • MainActivityComponent@Subcomponent一个ApplicationComponent
  • XXXControllerComponent@Subcomponent一个MainActivityComponent

MainActivity要在我使用的内部注入依赖项,我发现这段代码很常见:

protected void injectDependencies(ApplicationComponent component) {
    component.plus(new MainActivityModule(this)).inject(this);
}

当我想创建和注入依赖项到我Controller的 s.

MainActivity外观如下:

@ActivityScope
@Subcomponent(modules = {
        MainActivityModule.class
})
public interface MainActivityComponent {

    XXXListComponent newXXXListComponent(XXXListModule xxxListModule);

    void inject(MainActivity activity);
}

目前,典型的Controller看起来是这样的:

@ControllerScope
@Subcomponent(modules = {
        XXXListModule.class
})
public interface XXXListComponent {
    void inject(XXXListController controller);
}

和相应的Module

@Module
public class XXXListModule {

    private XXXListController listController;

    public XXXListModule(XXXListController listController) {
        this.listController = listController;
    }

    @Provides
    @ControllerScope
    public XXXListController getMainView() {
        return ListController;
    }
// other not important
}

基本上每个都Controller应该是单例的——我不想在里面有两个实例MainActivity——但这不是“必备”。

问题是如何创建Controller正确的方法。目前,MainActivity请执行以下操作:

router.pushController(RouterTransaction.with(new XXXListController()));

我不确定这一点,为什么要Controller手动创建?

Controller在里面onCreateView()我已经注入了所有需要的依赖项——在我看来以非常丑陋的方式:

((MainActivity) getActivity()).getMainActivityComponent()
    .newXXXListComponent(new XXXListModule(this))
    .inject(this);

这个长长的问题帮助我整理了关于 Dagger 的知识——也许有人觉得它有帮助。但!对于那些到达这条线的Stackoverflowers,这是一个好方法还是有其他更好的方法来做到这一点?

4

1 回答 1

0

我不确定我是否完全理解您的问题,但由于您有多个活动,您可能希望在您的应用程序而不是 MainActivity 中进行注入。否则它们将不再是单例,因为当您在它们之间移动时会重新创建活动。例如,如果您创建一个名为ConductorApplication

public class ConductorApplication extends Application {
    static AppComponent app_component;
    static ClockComponent component;

    @Override
    public void onCreate() {
        super.onCreate();
        app_component = DaggerAppComponent.builder().appModule(new AppModule(this)).build();
        component = createComponent();
    }



    protected ClockComponent createComponent() {
        return DaggerClockComponent.builder().build();
    }

    public static ClockComponent getClockComponent() {
        return component;
    }

    public ClockComponent component() {
        return component;
    }

    public static AppComponent GetAppComponent() {
        return app_component;
    }
}

然后在创建控制器时在内部,例如在inflateView()内部HomeController

public class HomeController extends BaseController {

    private HomeViewModel homeViewModel;
    private ControllerHomeBinding binding;


    @Inject
    Clock clock;

    @NonNull
    @Override
    protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
        ConductorApplication.getClockComponent().inject(this);
        return inflater.inflate(R.layout.controller_home, container, false);
...
}

如果您还没有,您可能需要添加:

<application 
    android:name=".ConductorApplication" 
    ...
    <activity
        android:name=".MainActivity"
        ...
    </activity>
</application>

在你的里面AndroidMainifest.xml

于 2017-04-11T07:02:54.290 回答