I want to use EventBus to set new state and rerender Android Auto Screen.
package com.capsule
import androidx.car.app.CarContext
import androidx.car.app.Screen
import androidx.car.app.model.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class CarPlayScreen(carContext: CarContext) : Screen(carContext) {
private var template: Template
private var eventBus = EventBus.getDefault()
@Subscribe(threadMode = ThreadMode.MAIN)
fun onCapsuleStateUpdate(state: CapsuleState) {
template = GridTemplate.Builder()
.setTitle("Temperature: ${state.temperature}C")
.build()
}
init {
eventBus.register(this)
val row = Row.Builder()
.setTitle("Wait state update")
.build()
val pane = Pane.Builder()
.addRow(row)
.build()
template = PaneTemplate.Builder(pane)
.setHeaderAction(Action.APP_ICON)
.build()
invalidate()
}
override fun onGetTemplate(): Template {
return template
}
}
When I run app on emulator I see init template
But after calling onCapsuleStateUpdate
rerender doesn't work and in console I see:
E Could not dispatch event: class com.capsule.CapsuleState to subscribing class class com.capsule.CarPlayScreen
java.lang.IllegalStateException: Template is in a loading state but lists are added, or vice versa
at androidx.car.app.model.GridTemplate$Builder.build(GridTemplate.java:282)
at com.capsule.CarPlayScreen.onCapsuleStateUpdate(CarPlayScreen.kt:24)
at java.lang.reflect.Method.invoke(Native Method)
at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:517)
at org.greenrobot.eventbus.EventBus.postToSubscription(EventBus.java:444)
at org.greenrobot.eventbus.EventBus.postSingleEventForEventType(EventBus.java:421)
at org.greenrobot.eventbus.EventBus.postSingleEvent(EventBus.java:394)
at org.greenrobot.eventbus.EventBus.post(EventBus.java:275)
at com.capsule.CapsuleBleManager.followState$lambda$10(CapsuleBleManager.kt:190)
at com.capsule.CapsuleBleManager.$r8$lambda$6x0OdCCBxFndfQ6AFD4N11VDXro(Unknown Source:0)
at com.capsule.CapsuleBleManager$$ExternalSyntheticLambda0.onDataReceived(Unknown Source:2)
at no.nordicsemi.android.ble.ValueChangedCallback.lambda$notifyValueChanged$0(ValueChangedCallback.java:184)
at no.nordicsemi.android.ble.ValueChangedCallback$$ExternalSyntheticLambda1.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:914)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7560)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Description of the error
IllegalStateException – if the template is in a loading state but there are lists added, or vice versa, or if the template does not have either a title or header Action set.
But I can't understand why template is in loading state if it was rendered. How to fix it?