MVP_generator_solution 15.1 KB
Newer Older
J
jessyan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
MVPArms框架自动生成MVP及Dagger2相关文件解决方案


(设置)Setting -> Editor ->  File and Code Templates -> Files 然后点击左上角绿色的+号


下面有7个Template,将分隔符上Name: 后的字符复制到Name输入框里,将分隔符里的内容复制进下面的大输入框,复制完后在继续点+
创建下一个,重复之前的操作,一共创建7个Template,点击右下角的ok按钮,现在在对应的包下点鼠标右键New选择项里就有刚才创建的
Template了,点击对应Template,在输入框中输入名字就可以创建对应的文件
再按照Contract->Model->Presenter->Activity->Module->Component的顺序在对应包下构建这6个模版,名字必须一样,这下
对应页面的Dagger和Mvp类即自动生成了,就可以专注写逻辑了
以下模版可以根据需求做相应修改



Name: Activity
--------------------------------------------------------------------------------------

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;

import com.jess.arms.utils.UiUtils;


import static com.jess.arms.utils.Preconditions.checkNotNull;

/**
  * 通过Template生成对应页面的MVP和Dagger代码,请注意输入框中输入的名字必须相同
  * 由于每个项目包结构都不一定相同,所以每生成一个文件需要自己导入import包名,可以在设置中设置自动导入包名
  * 请在对应包下按以下顺序生成对应代码,Contract->Model->Presenter->Activity->Module->Component
  * 因为生成Activity时,Module和Component还没生成,但是Activity中有它们的引用,所以会报错,但是不用理会
  * 继续将Module和Component生成完后,编译一下项目再回到Activity,按提示修改一个方法名即可
  * 如果想生成Fragment的相关文件,则将上面构建顺序中的Activity换为Fragment,并将Component中inject方法的参数改为此Fragment
  */

#parse("File Header.java")

public class ${NAME}Activity extends WEActivity<${NAME}Presenter> implements ${NAME}Contract.View {


    @Override
    protected void setupActivityComponent(AppComponent appComponent) {
        Dagger${NAME}Component
                .builder()
                .appComponent(appComponent)
                .${NAME}Module(new ${NAME}Module(this)) //请将${NAME}Module()第一个首字母改为小写
                .build()
                .inject(this);
    }

    @Override
    protected View initView() {
        return LayoutInflater.from(this).inflate(layout_id, null, false);
    }

    @Override
    protected void initData() {

    }



    @Override
    public void showLoading() {

    }

    @Override
    public void hideLoading() {

    }

    @Override
    public void showMessage(@NonNull String message) {
        checkNotNull(message);
        UiUtils.SnackbarText(message);
    }

    @Override
    public void launchActivity(@NonNull Intent intent) {
        checkNotNull(intent);
        UiUtils.startActivity(this, intent);
    }

    @Override
    public void killMyself() {
        finish();
    }


}

--------------------------------------------------------------------------------------




Name: Component
--------------------------------------------------------------------------------------

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import com.jess.arms.di.scope.ActivityScope;

import dagger.Component;

/**
  * 通过Template生成对应页面的MVP和Dagger代码,请注意输入框中输入的名字必须相同
  * 由于每个项目包结构都不一定相同,所以每生成一个文件需要自己导入import包名,可以在设置中设置自动导入包名
  * 请在对应包下按以下顺序生成对应代码,Contract->Model->Presenter->Activity->Module->Component
  * 因为生成Activity时,Module和Component还没生成,但是Activity中有它们的引用,所以会报错,但是不用理会
  * 继续将Module和Component生成完后,编译一下项目再回到Activity,按提示修改一个方法名即可
  * 如果想生成Fragment的相关文件,则将上面构建顺序中的Activity换为Fragment,并将Component中inject方法的参数改为此Fragment
  */

#parse("File Header.java")

@ActivityScope
@Component(modules = ${NAME}Module.class,dependencies = AppComponent.class)
public interface ${NAME}Component {
    void inject(${NAME}Activity activity);
}
--------------------------------------------------------------------------------------




Name: Contract
--------------------------------------------------------------------------------------

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import com.jess.arms.mvp.BaseView;
J
jessyan 已提交
139
import com.jess.arms.mvp.IModel;
J
jessyan 已提交
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157

/**
  * 通过Template生成对应页面的MVP和Dagger代码,请注意输入框中输入的名字必须相同
  * 由于每个项目包结构都不一定相同,所以每生成一个文件需要自己导入import包名,可以在设置中设置自动导入包名
  * 请在对应包下按以下顺序生成对应代码,Contract->Model->Presenter->Activity->Module->Component
  * 因为生成Activity时,Module和Component还没生成,但是Activity中有它们的引用,所以会报错,但是不用理会
  * 继续将Module和Component生成完后,编译一下项目再回到Activity,按提示修改一个方法名即可
  * 如果想生成Fragment的相关文件,则将上面构建顺序中的Activity换为Fragment,并将Component中inject方法的参数改为此Fragment
  */

#parse("File Header.java")

public interface ${NAME}Contract {
    //对于经常使用的关于UI的方法可以定义到BaseView中,如显示隐藏进度条,和显示文字消息
    interface View extends BaseView {

    }
    //Model层定义接口,外部只需关心model返回的数据,无需关心内部细节,及是否使用缓存
J
jessyan 已提交
158
    interface Model extends IModel{
J
jessyan 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366

    }
}
--------------------------------------------------------------------------------------


Name: Fragment
--------------------------------------------------------------------------------------

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;

import com.jess.arms.utils.UiUtils;

import butterknife.Bind;

import static com.jess.arms.utils.Preconditions.checkNotNull;

/**
  * 通过Template生成对应页面的MVP和Dagger代码,请注意输入框中输入的名字必须相同
  * 由于每个项目包结构都不一定相同,所以每生成一个文件需要自己导入import包名,可以在设置中设置自动导入包名
  * 请在对应包下按以下顺序生成对应代码,Contract->Model->Presenter->Activity->Module->Component
  * 因为生成Activity时,Module和Component还没生成,但是Activity中有它们的引用,所以会报错,但是不用理会
  * 继续将Module和Component生成完后,编译一下项目再回到Activity,按提示修改一个方法名即可
  * 如果想生成Fragment的相关文件,则将上面构建顺序中的Activity换为Fragment,并将Component中inject方法的参数改为此Fragment
  */

#parse("File Header.java")

public class ${NAME}Fragment extends WEFragment<${NAME}Presenter> implements ${NAME}Contract.View{


    public static ${NAME}Fragment newInstance() {
        ${NAME}Fragment fragment = new ${NAME}Fragment();
        return fragment;
    }

    @Override
    protected void setupFragmentComponent(AppComponent appComponent) {
        Dagger${NAME}Component
                .builder()
                .appComponent(appComponent)
                .${NAME}Module(new ${NAME}Module(this))//请将${NAME}Module()第一个首字母改为小写
                .build()
                .inject(this);
    }

    @Override
    protected View initView() {
        return LayoutInflater.from(getActivity()).inflate(layout_id, null, false);
    }

    @Override
    protected void initData() {

    }

    /**
     * 此方法是让外部调用使fragment做一些操作的,比如说外部的activity想让fragment对象执行一些方法,
     * 建议在有多个需要让外界调用的方法时,统一传bundle,里面存一个what字段,来区分不同的方法,在setData
     * 方法中就可以switch做不同的操作,这样就可以用统一的入口方法做不同的事,和message同理
     *
     * 使用此方法时请注意调用时fragment的生命周期,如果调用此setData方法时onActivityCreated
     * 还没执行,setData里调用presenter的方法时,是会报空的,因为dagger注入是在onActivityCreated
     * 方法中执行的,如果要做一些初始化操作,可以不必让外部调setData,在内部onActivityCreated中
     * 初始化就可以了
     *
     * @param data
     */

    @Override
    public void setData(Object data) {

    }


    @Override
    public void showLoading() {

    }

    @Override
    public void hideLoading() {

    }

    @Override
    public void showMessage(@NonNull String message) {
        checkNotNull(message);
        UiUtils.SnackbarText(message);
    }

    @Override
    public void launchActivity(@NonNull Intent intent) {
        checkNotNull(intent);
        UiUtils.startActivity(getActivity(), intent);
    }

    @Override
    public void killMyself() {

    }

}
--------------------------------------------------------------------------------------


Name: Model
--------------------------------------------------------------------------------------

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import android.app.Application;
import com.google.gson.Gson;
import com.jess.arms.mvp.BaseModel;

import static com.jess.arms.utils.Preconditions.checkNotNull;


/**
  * 通过Template生成对应页面的MVP和Dagger代码,请注意输入框中输入的名字必须相同
  * 由于每个项目包结构都不一定相同,所以每生成一个文件需要自己导入import包名,可以在设置中设置自动导入包名
  * 请在对应包下按以下顺序生成对应代码,Contract->Model->Presenter->Activity->Module->Component
  * 因为生成Activity时,Module和Component还没生成,但是Activity中有它们的引用,所以会报错,但是不用理会
  * 继续将Module和Component生成完后,编译一下项目再回到Activity,按提示修改一个方法名即可
  * 如果想生成Fragment的相关文件,则将上面构建顺序中的Activity换为Fragment,并将Component中inject方法的参数改为此Fragment
  */

#parse("File Header.java")

public class ${NAME}Model extends BaseModel<ServiceManager,CacheManager> implements ${NAME}Contract.Model{
    private Gson mGson;
    private Application mApplication;

    public ${NAME}Model(ServiceManager serviceManager, CacheManager cacheManager, Gson gson, Application application) {
        super(serviceManager, cacheManager);
        this.mGson = gson;
        this.mApplication = application;
    }


}

--------------------------------------------------------------------------------------


Name: Module
--------------------------------------------------------------------------------------
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import com.google.gson.Gson;
import android.app.Application;
import com.jess.arms.di.scope.ActivityScope;

import dagger.Module;
import dagger.Provides;

/**
  * 通过Template生成对应页面的MVP和Dagger代码,请注意输入框中输入的名字必须相同
  * 由于每个项目包结构都不一定相同,所以每生成一个文件需要自己导入import包名,可以在设置中设置自动导入包名
  * 请在对应包下按以下顺序生成对应代码,Contract->Model->Presenter->Activity->Module->Component
  * 因为生成Activity时,Module和Component还没生成,但是Activity中有它们的引用,所以会报错,但是不用理会
  * 继续将Module和Component生成完后,编译一下项目再回到Activity,按提示修改一个方法名即可
  * 如果想生成Fragment的相关文件,则将上面构建顺序中的Activity换为Fragment,并将Component中inject方法的参数改为此Fragment
  */

#parse("File Header.java")

@Module
public class ${NAME}Module {
    private ${NAME}Contract.View view;

    /**
     * 构建${NAME}Module时,将View的实现类传进来,这样就可以提供View的实现类给presenter
     * @param view
     */
    public ${NAME}Module(${NAME}Contract.View view) {
        this.view = view;
    }

    @ActivityScope
    @Provides
    ${NAME}Contract.View provide${NAME}View(){
        return this.view;
    }

    @ActivityScope
    @Provides
    ${NAME}Contract.Model provide${NAME}Model(ServiceManager serviceManager, CacheManager cacheManager
    ,Gson gson,Application application){
        return new ${NAME}Model(serviceManager,cacheManager,gson,application);
    }
}
--------------------------------------------------------------------------------------


Name: Presenter
--------------------------------------------------------------------------------------

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import android.app.Application;
J
jessyan 已提交
367
import com.jess.arms.base.AppManager;
J
jessyan 已提交
368 369 370 371
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.widget.imageloader.ImageLoader;
import com.tbruyelle.rxpermissions.RxPermissions;
J
jessyan 已提交
372 373 374
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import javax.inject.Inject;

J
jessyan 已提交
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394

/**
  * 通过Template生成对应页面的MVP和Dagger代码,请注意输入框中输入的名字必须相同
  * 由于每个项目包结构都不一定相同,所以每生成一个文件需要自己导入import包名,可以在设置中设置自动导入包名
  * 请在对应包下按以下顺序生成对应代码,Contract->Model->Presenter->Activity->Module->Component
  * 因为生成Activity时,Module和Component还没生成,但是Activity中有它们的引用,所以会报错,但是不用理会
  * 继续将Module和Component生成完后,编译一下项目再回到Activity,按提示修改一个方法名即可
  * 如果想生成Fragment的相关文件,则将上面构建顺序中的Activity换为Fragment,并将Component中inject方法的参数改为此Fragment
  */



#parse("File Header.java")

@ActivityScope
public class ${NAME}Presenter extends BasePresenter<${NAME}Contract.Model, ${NAME}Contract.View> {
    private RxErrorHandler mErrorHandler;
    private Application mApplication;
    private RxPermissions mRxPermissions;
    private ImageLoader mImageLoader;
J
jessyan 已提交
395
    private AppManager mAppManager;
J
jessyan 已提交
396 397 398 399

    @Inject
    public ${NAME}Presenter (${NAME}Contract.Model model, ${NAME}Contract.View rootView
            , RxErrorHandler handler, Application application, RxPermissions rxPermissions
J
jessyan 已提交
400
            , ImageLoader imageLoader, AppManager appManager) {
J
jessyan 已提交
401 402 403 404 405
        super(model, rootView);
        this.mErrorHandler = handler;
        this.mApplication = application;
        this.mRxPermissions = rxPermissions;
        this.mImageLoader = imageLoader;
J
jessyan 已提交
406
        this.mAppManager = appManager;
J
jessyan 已提交
407 408 409 410 411 412 413 414
    }


}

--------------------------------------------------------------------------------------