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.
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.
J'ai eu exactement le même problème, vous devez créer des types nullable ici:
override fun onCreatePreferences(bundle: Bundle?, s: String?) {}
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)
}
}
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:
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.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())
}