我可以在Fragment中注册MVP Presenter吗?

问题描述 投票:12回答:1

我一直在关注Google提供的MVP设计模式来重构我的应用程序。我有一个MainActivity和许多片段,我为每个片段创建活动似乎很麻烦,所以我一直在考虑在片段中注册演示者。我所看到的是每个片段都注册了它自己的演示者,但我不确定它有多大的错误...... :)

所以这是我的演示者:

public class FirstPresenter implements FirstContract.Presenter {
    private final FirstContract.View mView;

    public FirstPresenter(FirstContract.View view) {
        mView = view;
    }

    @Override
    public void start() {
        Log.e(TAG, "Start");
    }
}

这是我的片段:

public class FirstFragment extends Fragment implements FirstContract.View {
    private FirstContract.Presenter mPresenter;

@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container
            , Bundle savedInstanceState) {
...
// I register firstFragment's presenter here.
mPresenter = new FirstPresenter(this);
...

所以我的问题是,这是正确的方法吗?我可以在活动中将Presenter注册到Fragment中吗?如果不是正确的方法,是否有一些很好的例子来处理一个活动和多个片段的MVP?

谢谢你们,BR!

android android-fragments android-activity mvp android-mvp
1个回答
18
投票

正如你在谷歌的样本(https://github.com/googlesamples/android-architecture)中看到的那样,Activities创造了Presenters。此外Views附加到ActivityPresenters获取视图(Fragments)作为参数。

Fragment事务提交或Fragment(查看)状态恢复Presenters得到创建并采取Fragments(视图)作为参数比调用

view.setPresenter(T presenter); 

观察方法和Presenters注册查看。

我认为在Presenter创建Fragment不是一个好习惯。首先,它们是分开的层。这对于关注点分离是非法的。第二,如果你在Fragment中创建演示者,你将你的Presenter的生命绑定到视图的LifeCycle,当Fragment被销毁并重新创建时,你创建了一个新的演示者,但它们是不同的层。

该模型是定义要在用户界面中显示或以其他方式操作的数据的接口。

演示者对模型和视图起作用。它从存储库(模型)中检索数据,并将其格式化以在视图中显示。

视图是一个被动接口,它显示数据(模型)并将用户命令(事件)路由到演示者以对该数据进行操作。

所以Activity可以充当overall controller,创造PresentersViews并连接它们。

enter image description here

如果我们谈论您的问题,是的,您可以在片段中注册演示者。但是,您应该避免在用作视图的片段中创建演示者。

但是在Android社区中有很多关于MVP模式的方法,如下所示。 https://plus.google.com/communities/114285790907815804707

为什么活动不是ui元素? http://www.techyourchance.com/activities-android/

© www.soinside.com 2019 - 2024. All rights reserved.