【发布时间】:2020-08-24 15:33:57
【问题描述】:
我在我的 kotlin 应用程序中使用 Android MVVM。我有一个UserViewModel 类,其中包含应用程序运行所需的所有用户相关数据。
class UserViewModel(application: Application) : AndroidViewModel(application) {
val currentUid = MutableLiveData<String>()
var currentUser = MutableLiveData<User>()
// More code here...
}
currentUser 在启动时从 Firestore 中获取,并可供所有活动使用。我想访问User 中的currentPlan 对象。我这样做:
someFunc(userViewModel.value!!.currentPlan!!)
这在我的HomeFragment 在我的MainActivity 中运行良好。 HomeFragment 有一个消息按钮,可将用户带到ChatActivty。
问题是当我在ChatActivity 中执行相同的函数调用时,我得到了这个错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.**, PID: 30420
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.makeshaadi/com.makeshaadi.ChatActivity}: kotlin.KotlinNullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2946)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6810)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
Caused by: kotlin.KotlinNullPointerException
at com.makeshaadi.ChatActivity.onCreate(ChatActivity.kt:52)
at android.app.Activity.performCreate(Activity.java:7224)
at android.app.Activity.performCreate(Activity.java:7213)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2926)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6810)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
I/Process: Sending signal. PID: 30420 SIG: 9
为什么userVM.value 在ChatActivity 中变为空。我做错了什么?
【问题讨论】:
-
ChatActivity 中有一个不同的 ViewModel 实例。 ViewModel 不是单例
-
哇!我该如何解决?我这样声明它们:
private val userVM: UserViewModel by viewModels()@tyczj -
长话短说,您希望 ViewModel 不是单例,它们是为每个活动创建的。您可以创建某种类似于单例的“UserService”类,然后将此类传递给您的视图模型。您可能想考虑使用
Dependency Injection -
在单个 Activity 中使用多个 Fragment 而不是多个 Activity。在Fragment中使用
by activityViewModels(),不同的Fragment会得到同一个实例。