web-dev-qa-db-fra.com

IllegalArgumentException: savedInstanceState spécifié comme non-Null est Null

Je reçois une erreur étrange lorsque je lance ma MainActivity:

06-16 16:01:05.193 2083-2083/? E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.Android.example.github, PID: 2083
        Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Android.example.github/com.Android.example.github.ui.MainActivity}: Java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
            at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2666)
            at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2727)
            at Android.app.ActivityThread.-wrap12(ActivityThread.Java)
            at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1478)
            at Android.os.Handler.dispatchMessage(Handler.Java:102)
            at Android.os.Looper.loop(Looper.Java:154)
            at Android.app.ActivityThread.main(ActivityThread.Java:6121)
            at Java.lang.reflect.Method.invoke(Native Method)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:889)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:779)
          Caused by: Java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
            at com.Android.example.github.injection.AppInjector$init$1.onActivityCreated(AppInjector.kt)
            at Android.app.Application.dispatchActivityCreated(Application.Java:197)
            at Android.app.Activity.onCreate(Activity.Java:961)
            at Android.support.v4.app.BaseFragmentActivityGingerbread.onCreate(BaseFragmentActivityGingerbread.Java:54)
            at Android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.Java:319)
            at com.Android.example.github.ui.MainActivity.onCreate(MainActivity.kt:20)
            at Android.app.Activity.performCreate(Activity.Java:6682)
            at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1118)
            at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2619)
            at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2727) 
            at Android.app.ActivityThread.-wrap12(ActivityThread.Java) 
            at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1478) 
            at Android.os.Handler.dispatchMessage(Handler.Java:102) 
            at Android.os.Looper.loop(Looper.Java:154) 
            at Android.app.ActivityThread.main(ActivityThread.Java:6121) 
            at Java.lang.reflect.Method.invoke(Native Method) 
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:889) 
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:779) 

Ceci est ma classe MainActivity:

class MainActivity : LifecycleActivity(), HasSupportFragmentInjector {

    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Fragment>
        @Inject set

    lateinit var navigationController: NavigationController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        if (savedInstanceState == null) {
            navigationController.navigateToSearch()
        }
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment> {
        return dispatchingAndroidInjector
    }

}

L'erreur indique que le paramètre savedInstanceState est null, lorsqu'il est spécifié comme non-null; mais c'est nullable (savedInstanceState: Bundle?) et la méthode onCreate() est marquée comme @Nullable dans la source.

Je n'ai rencontré cette erreur dans aucun de mes autres projets Kotlin. J'utilise Kotlin version 1.1.2-5; et a eu la même erreur avec 1.1.2-3.

21
Bryan

Il semble que le problème ne soit pas dans la méthode onCreate. Essayez de regarder com.Android.example.github.injection.AppInjector$init$1.onActivityCreated(AppInjector.kt). Je ne peux pas dire si c'est une classe générée, mais cela devrait vous donner une idée de ce qu'il faut faire ensuite.

8
mcassiano

J'ai eu exactement le même problème, vous devez créer des types nullable ici:

override fun onCreatePreferences(bundle: Bundle?, s: String?) {}
47
lxknvlk

Le problème est dans AppInjector. J'ai utilisé l'exemple de Google GitHubBrowser comme vous l'avez fait et j'ai rencontré la même erreur. J'ai copié le code sur mon projet et laissé Android Studio le convertir en Kotlin. Lorsqu’il a fait cela, il n’a pas spécifié correctement la nullité du paramètre savedInstanceState qui est à l’origine du blocage. Faites-le simplement comme dans le code ci-dessous et cela fonctionnera.

object AppInjector {
    fun init(app: App) {
        DaggerAppComponent.builder().application(app)
                .build().inject(app)
        app
                .registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
                    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
                        handleActivity(activity)
                    }

                    override fun onActivityStarted(activity: Activity) {

                    }

                    override fun onActivityResumed(activity: Activity) {

                    }

                    override fun onActivityPaused(activity: Activity) {

                    }

                    override fun onActivityStopped(activity: Activity) {

                    }

                    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {

                    }

                    override fun onActivityDestroyed(activity: Activity) {

                    }
                })
    }

    private fun handleActivity(activity: Activity) {
        if (activity is HasSupportFragmentInjector) {
            AndroidInjection.inject(activity)
        }
        (activity as? FragmentActivity)?.supportFragmentManager?.registerFragmentLifecycleCallbacks(
                object : FragmentManager.FragmentLifecycleCallbacks() {
                    override fun onFragmentCreated(fm: FragmentManager?, f: Fragment?,
                                                   savedInstanceState: Bundle?) {
                        if (f is Injectable) {
                            AndroidSupportInjection.inject(f)
                        }
                    }
                }, true)
    }
}
6
Chris

Comme @mcassiano l'a noté, il semble que le problème ne vient pas de votre méthode onCreate mais bien de onActivityCreated. Deux pensées:

  • En raison du fait que les bibliothèques et autres sont en transition, pour le moment, vous devrez peut-être remplacer manuellement onActivityCreated dans votre fragment et marquer explicitement l'ensemble à nullable: (savedInstanceState: Bundle?). Vous ne devriez pas avoir à le faire, mais configurer manuellement la nullabilité peut simplement aider.
  • Je constate que le crash se produit jusqu'à BaseFragmentActivityGingerbread - est-ce le résultat de l'utilisation de LifecycleActivity? Ou avez-vous d'autres dépendances plus anciennes et obsolètes dans votre projet?
2
creativedrewy

Vous pouvez utiliser l'opérateur ?: à coalescence nulle. La savedInstanceState sera transmise à la méthode super.onCreate uniquement s'il s'agit de @NonNull, sinon, si c'est null, une Bundle() vide sera transmise.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState?: Bundle())
}