無意間在android studio中看到了 MVP Generator 插件,插件的github地址爲:https://github.com/stfalcon-studio/MVPHelper;插件的作者沒有說明這個插件的具體使用方式,導致做爲新手摺騰了好一段時間啊,現在記錄一下這個插件的使用方式,該插件主要是快速創建mvp框架,其中使用了MVP + Dagger + Rx , 是編寫Kotlin代碼時使用;
MVP Generator的使用注意事項:
1.首先需要在android studio 中添加插件 Mvp Generator:
File -->Setting-->Plugins -->Browse repositories...,搜索Mvp Generator ,install ---> restart As;
2.在項目app module中java包下創建相應的模塊文件夾名稱,右鍵new–>+mvp–>選擇創建Activity或者fragment–>輸入要創建的Activity或者fragment名稱,例如:login, 同時需要點擊kotlin base DI classes,生成di文件夾及代碼;
3.此時會自動生成如圖所示的類和文件夾
4.此時生成的就是mvp的架子,但是你點開,發現全報錯,why? 我就這完全不知所措了。。。。。
5.淡定,其實如果瞭解Dagger2的朋友,肯定知道,那就是我們需要導入一些依賴:
ext這個和dependencies同個級別,其實就是來控制依賴的版本,完全可以不用
ext {
support_libraries_version = '25.3.1'
dagger_version = '2.10'
}
在項目 module的bulid.gradle的
dependencies {......}中添加如下:
//Dagger
compile 'com.github.stfalcon:mvphelper:0.2.1'
compile "com.google.dagger:dagger:$dagger_version"
compile "com.google.dagger:dagger-android:$dagger_version"
compile "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
//Rx
compile 'io.reactivex.rxjava2:rxjava:2.0.8'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt' //新增kotlin kapt腳本
/**
*注掉了kapt代碼,因爲kapt3不支持
*/
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> kotlin.jvm.internal.FunctionReference.<init>(ILjava/lang/Object;)V
//kapt {
// generateStubs = true
//}
kapt主要是爲了生成DaggerAppComponent類,該類在app\build\generated\source\kapt\debug\com\example\szw\myapplication\di\components\DaggerAppComponent.java
添加如圖所示:
6. 可能還需要在項目的build.gradle中添加依賴:
classpath 'com.novoda:bintray-release:0.3.4'
7.到這裏差不多就算配置的差不多了,然後開始移動代碼
- 在factories文件夾中可以看到兩個類:ActivitiesInjectorFactories和FragmentsInjectorFactories,
如果你是創建的activity,那麼會在xxxxxActivitySubComponent中生成
@Binds
@IntoMap
@ActivityKey(xxxxxActivity::class)
internal abstract fun bindxxxxxActivityInjectorFactory(
builder: xxxxxActivitySubComponent.Builder): AndroidInjector.Factory<out Activity>
如果是fragment,在xxxxFragmentSubComponent中有如下代碼:
@Binds
@IntoMap
@FragmentKey(xxxxFragment::class)
internal abstract fun bindxxxxFragmentInjectorFactory(builder: xxxxFragmentSubComponent.Builder):
AndroidInjector.Factory<out Fragment>
把這些代碼,如果是Activity中的就剪貼到ActivitiesInjectorFactories中;
Fragment中的就剪貼到FragmentsInjectorFactories中。
2.如果是創建的fargment,同時需要在FragmentsInjectorFactories中的這段代碼裏添加:
@Module(subcomponents = arrayOf(
// register your fragments' subcomponents here
xxxxFragmentSubComponent::class //這裏添加生成的xxxxFragmentSubComponent
))
- 如果是創建的activity,同時需要在module文件夾下的AppModule類的下面代碼中添加:
@Module(subcomponents = arrayOf(
// register your activities' subcomponents here
xxxxxActivitySubComponent::class //這裏添加生成的xxxxxActivitySubComponent
))
4.最後一步,就是把App這個配置到AndroidManifest.xml中去,如下:
<application
android:name=".App" //就是這裏
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".login.LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
5.也是最重要的一步,就是需要重新編譯,看能不能生成DaggerAppComponent類,如果沒有,看下什麼地方不對,在檢查檢查,就ok了。。