//基类 V (MvpFragment 同理)abstract class MvpActivity<P> : MvcActivity() { val presenter: P by lazy { getP() } /** * 获取逻辑处理实例,子类实现 */ abstract fun getP(): P …… }//具体实现class SearchActivity : MvpActivity<SearchPresenter>() {//泛型指定 P 的依赖关系 // 这里实例化 P 并且 注入 V override fun getP() = SearchPresenter().apply { view = this@SearchActivity }}//基类 Popen class BasePresenter<V : Any, out M> : ViewLifecycle() { /** * UI视图,即Activity或Fragment */ var view: V by Delegates.notNull() /** * 业务模型,即XXXModel,这里使用java反射(kotlin反射太慢,暂时不建议使用)创建示例,省去在每个Presenter中创建实例 */ val model: M by lazy { //这里使用 Java 反射实例化 M, ReflectionUtils.getSuperClassGenricType<M>(this, 1) } ……}//具体实现class SearchPresenter : BasePresenter<SearchActivity, MainModel>() {//泛型指定 V 和 M 的具体实现 ……}
通过上面代码,Mvp 之间的关系就建立起来了,需要注意的是 M 是通过Java 反射实例化的(省去在 P 的实现类中去实例化,直接使用即可),具体使用请参考代码。
有没有同学遇到修改遗留 Bug 找某个点击事件的时候,要跳转 N 个类,最后发现事件监听里面发了一个 Event 事件,然后又得找是谁消费了事件,发现居然有 N 个类都有消费(一脸懵逼,我的真实遭遇。。。) ,本项目的处理方式是将最终的监听都放在 V 中 的 addListener 方法中,找交互事件的时候可以快速定位。