Arello-Mobile / Moxy

Moxy is MVP library for Android
https://github.com/Arello-Mobile/Moxy/wiki
MIT License
1.6k stars 207 forks source link

@InjectPresenter не работает - 2 #88

Closed Koroqe closed 7 years ago

Koroqe commented 7 years ago

Здравствуйте! Та же ситуация как и https://github.com/Arello-Mobile/Moxy/issues/49

Выбрасывает: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.project.presentation.presenter.splash.SplashPresenter.checkLoggedInAndNavigate()' on a null object reference

build.gradle:

// Moxy
compile 'com.arello-mobile:moxy:1.1.2'
provided 'com.arello-mobile:moxy-compiler:1.1.2'
compile 'com.arello-mobile:moxy-app-compat:1.1.2'
...

View унаследованная от MvpVIew:

public interface SplashView extends MvpView {

    void navigateToMainScreen();
    void navigateToLoginScreen();
}

Presenter, от MvpPresenter:

@InjectViewState
public class SplashPresenter extends MvpPresenter<SplashView> {

    SplashModel mModel;

    public SplashPresenter(SplashModel model) {

        mModel = model;
    }

    public void checkLoggedInAndNavigate() {

        if (checkLoggedIn()) {
            getViewState().navigateToMainScreen();
        } else {
            getViewState().navigateToLoginScreen();
        }
    }

И Activity:

public class SplashActivity extends MvpAppCompatActivity implements SplashView {

@InjectPresenter
SplashPresenter mSplashPresenter;

Handler handler;
Runnable runnable;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash_screen);

    handler = new Handler();
    runnable = () -> mSplashPresenter.checkLoggedInAndNavigate();
}

Получается, не смотря на аннотацию, presenter не инициализируется и остается Null. Что-то упустил?

senneco commented 7 years ago

Интересно, а как вы предполагаете создастся экземпляр SplashPresenter, если он на вход себе ожидает некую SplashModel?

PS: если что, то у вас совсем другая ситуация, нежели в #49, раз вам не помогает такое решение, которое помогло в той ситуации ;)

Koroqe commented 7 years ago

Да, прошу прощения, код переписывался туда-обратно, сейчас конструктор без параметров:

`public SplashPresenter() {

    mModel = new SplashModel();
}`

Но выбрасывает точно то же исключение

senneco commented 7 years ago

Можете привести весь ваш build.gradle? Если там нет ничего секьюрного конечно =)

PS: так же советую использовать последнюю версию библиотеки 1.4.5 и annotationProcessor вместо provided

Koroqe commented 7 years ago
buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    //Crashlytics
    maven {
        url 'https://maven.fabric.io/public'
    }
    //Mockito
    jcenter()
}

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.project"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        jackOptions {
            enabled true
        }
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    //Crashlytics
    compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
        transitive = true;
    }

    // xml serialize\deserialize
    compile('org.simpleframework:simple-xml:2.7.+') {
        exclude module: 'stax'
        exclude module: 'stax-api'
        exclude module: 'xpp3'
    }

    compile 'com.android.support:support-v4:25.1.1'
    //Espresso
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    compile 'com.android.support:appcompat-v7:25.1.1'
    compile 'com.android.support:design:25.1.1'
    //phone mask
    compile 'ru.tinkoff.decoro:decoro:1.1.1'
    //circle view
    compile 'de.hdodenhof:circleimageview:2.1.0'
    // Retrofit
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    compile 'com.squareup.retrofit2:converter-simplexml:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    //RxAndroid
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'io.reactivex:rxjava:1.2.5'
    //rx bindings
    compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
    compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:0.4.0'
    //Gson
    compile 'com.google.code.gson:gson:2.4'
    // okhttp
    compile 'com.squareup.okhttp3:okhttp:3.5.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
    //Quickblox
    compile 'com.quickblox:quickblox-android-sdk-chat:3.3.0'
    compile 'com.android.support:multidex:1.0.1'
    //Firebase
    compile 'com.google.firebase:firebase-core:10.0.1'
    compile 'com.google.firebase:firebase-messaging:10.0.1'
    //Multidex
    compile 'com.android.support:multidex:1.0.1'
    //Facebook
    compile 'com.facebook.android:facebook-android-sdk:[4,5)'
    // Moxy
    compile 'com.arello-mobile:moxy:1.1.2'
    provided 'com.arello-mobile:moxy-compiler:1.1.2'
    compile 'com.arello-mobile:moxy-app-compat:1.1.2'
    //Mockito
    testCompile 'org.mockito:mockito-core:2.0.57-beta'
    //JUnit
    testCompile 'junit:junit:4.12'
    // Leakcanary
    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
}

apply plugin: 'com.google.gms.google-services'
senneco commented 7 years ago

Похоже, мокси 1.1.2 была ещё совсем не совместима с джеком. Сейчас дела обстоят лучше, но всё равно всё плохо. Потому что он затирает часть сгенеренного кода, когда вы меняете часть проекта(а не билдите весь проект).

Поэтому советую:

  1. взять самую свежую версию библиотеки
  2. заменить provided 'com.arello-mobile:moxy-compiler:1.1.2' на annotationProcessor 'com.arello-mobile:moxy-compiler:1.1.2'
  3. Убрать jack
Koroqe commented 7 years ago

Да, завелось с annotationProcessor и Clean Project. Спасибо за помощь, и вообще за такую крутую либу!

ilyaran commented 7 years ago

у меня тоже самое apply plugin: 'com.android.application' apply plugin: 'me.tatarka.retrolambda' apply plugin: 'realm-android'

android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

compileSdkVersion 25
buildToolsVersion "25.0.2"

defaultConfig {
    applicationId "com.johnaran.android.mobile.advert"
    minSdkVersion 14
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

lintOptions {
    abortOnError false
}

}

def support = '25.1.0' def retrofit = '2.1.0' def dagger = '2.7' def butterKnife = "8.4.0"

dependencies { compile "com.android.support:appcompat-v7:$support" compile "com.android.support:design:$support"

compile "com.jakewharton:butterknife:$butterKnife"

compile "com.squareup.retrofit2:retrofit:$retrofit"
compile "com.squareup.retrofit2:converter-gson:$retrofit"
compile "com.squareup.retrofit2:adapter-rxjava:$retrofit"

compile "com.google.dagger:dagger:$dagger"

annotationProcessor "com.jakewharton:butterknife-compiler:$butterKnife"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger"

testCompile 'junit:junit:4.12'
compile 'com.j256.ormlite:ormlite-core:4.48'
compile 'com.j256.ormlite:ormlite-android:4.48'
compile 'com.google.code.gson:gson:2.8.0'
compile 'com.squareup:otto:1.3.8'
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'de.hdodenhof:circleimageview:2.1.0'
compile 'com.github.bumptech.glide:glide:3.8.0'
compile 'com.android.support:support-v4:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'io.realm:android-adapters:1.4.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.0'
compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
compile 'com.android.support:gridlayout-v7:25.3.1'
compile 'com.arello-mobile:moxy:1.5.3'
compile 'com.arello-mobile:moxy-app-compat:1.5.3'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-all:1.10.19'
testCompile 'org.hamcrest:hamcrest-all:1.3'
testCompile 'org.robolectric:robolectric:3.1-rc1'
annotationProcessor 'com.arello-mobile:moxy-compiler:1.5.3'
provided 'org.glassfish:javax.annotation:10.0-b28'

} buildscript { dependencies { classpath "com.android.tools.build:gradle:2.3.3" classpath "io.realm:realm-gradle-plugin:3.4.0" classpath 'me.tatarka:gradle-retrolambda:3.2.5' } repositories { jcenter() mavenCentral() } } allprojects { repositories { jcenter() } }

Quireg commented 7 years ago

У меня возникла похожая проблема и Телеграм канале мне очень помогли. Activity в которую инжектим Presenter должна быть унаследована от MvpAppCompatActivity

abdullo211 commented 6 years ago

У меня тоже такое же проблема: Presenter: ` class LaunchPresenter : BasePresenter() {

private var mModel = LaunchModel()

override fun onFirstViewAttach() {
    super.onFirstViewAttach()
    launch()
}

private fun launch() {

    if (mModel.isTokenEmpty())
        viewState.openLoginPage()

    if (getAllUserData()) {
        if (mModel.isMenuEmpty()) {
            viewState.showError(error(EmptyStackException()))
            return
        }
        openMainPage()
    }
}

View: interface LaunchView :MvpView {

@StateStrategyType(SingleStateStrategy::class)
fun showHideProgress(isLoading:Boolean)

fun openLoginPage()

fun openDistribution()

fun openManufacture()

fun showLogOutDialog()

fun showError(@StringRes message: Int)

} Activity: class LaunchActivity : MvpAppCompatActivity(), LaunchView {

@InjectPresenter internal lateinit var mLaunchPresenter: LaunchPresenter

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_launch)
    initListeners()
}

override fun openLoginPage() {
    val intent = Intent(this, LoginActivity::class.java)
    startActivityForResult(intent, Constants.LOGIN_ACTIVITY_RESULT_CODE)
}

... ` Gradle :

apply plugin: 'kotlin-kapt'

dependency {
  compile 'com.arello-mobile:moxy-app-compat:1.5.3'
    kapt 'com.arello-mobile:moxy-compiler:1.5.3' }
abdullo211 commented 6 years ago

Все проблема решена, там не поставлен @InjectViewState