首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类com.mgr.ui.viewmodels.MainViewModel构造函数中发生的异常

类com.mgr.ui.viewmodels.MainViewModel构造函数中发生的异常
EN

Stack Overflow用户
提问于 2022-07-31 18:38:26
回答 1查看 27关注 0票数 1

我正在处理一份申请。当我从后台返回到应用程序时,我正在尝试恢复状态。我有一个例外,我现在不知道为什么会发生这种情况。所以,我决定在这里发帖,希望有人能发现我目前看不到的东西。

异常:

代码语言:javascript
复制
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.mgr/com.mgr.MainActivity}: 
java.lang.RuntimeException: An exception happened in constructor of class com.mgr.ui.viewmodels.MainViewModel

这可以追溯到:androidx.lifecycle.ViewModelProvider.Factory

代码语言:javascript
复制
internal fun <T : ViewModel?> newInstance(
    modelClass: Class<T>,
    constructor: Constructor<T>,
    vararg params: Any
): T {
    return try {
        constructor.newInstance(*params)
    } catch (e: IllegalAccessException) {
        throw RuntimeException("Failed to access $modelClass", e)
    } catch (e: InstantiationException) {
        throw RuntimeException("A $modelClass cannot be instantiated.", e)
    } catch (e: InvocationTargetException) {
        throw RuntimeException(
            "An exception happened in constructor of $modelClass", e.cause
        )
    }
}

现在有更多我自己的代码:

MainViewModel.tk

代码语言:javascript
复制
@HiltViewModel
class MainViewModel @Inject constructor(
    private val savedStateHandle: SavedStateHandle,
) : ViewModel()
{
    companion object {
        const val UI_MENU_STATE = "ui.menu.state"
    }

    init {
        savedStateHandle.get<Boolean>(UI_MENU_STATE)?.let {
                m -> onMenuStateChange(m);
        }
    }

    private var m_title by mutableStateOf("")
    private var displayMenu by mutableStateOf( false)

    var tosVisible by mutableStateOf( false)
        internal set

    fun updateTitleState(title: String){
        m_title = title;
    }

    fun onMenuStateChange(open: Boolean){
        Log.d("App", open.toString());
        displayMenu = open;
        savedStateHandle.set<Boolean>(UI_MENU_STATE, displayMenu);
    }

    fun isMenuOpen(): Boolean {
        return displayMenu;
    }

    fun getTitle(): String { return m_title; }
}

MainActivity:

代码语言:javascript
复制
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val mainViewModel = ViewModelProvider(
            this,
            SavedStateViewModelFactory(application, this)
        )[MainViewModel::class.java]

        setContent {
            MgrTheme {
                Surface(color = MaterialTheme.colorScheme.background) { Main(mainViewModel) }
            }
        }
    }
}

全堆栈跟踪:

代码语言:javascript
复制
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.mgr, PID: 11242
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mgr/com.mgr.MainActivity}: java.lang.RuntimeException: An exception happened in constructor of class com.mgr.ui.viewmodels.MainViewModel
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3676)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2308)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7898)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
     Caused by: java.lang.RuntimeException: An exception happened in constructor of class com.mgr.ui.viewmodels.MainViewModel
        at androidx.lifecycle.SavedStateViewModelFactoryKt.newInstance(SavedStateViewModelFactory.kt:234)
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:133)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
        at com.mgr.MainActivity.onCreate(MainActivity.kt:43)
        at android.app.Activity.performCreate(Activity.java:8290)
        at android.app.Activity.performCreate(Activity.java:8269)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3657)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2308) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:201) 
        at android.os.Looper.loop(Looper.java:288) 
        at android.app.ActivityThread.main(ActivityThread.java:7898) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void androidx.compose.runtime.MutableState.setValue(java.lang.Object)' on a null object reference
        at com.mgr.ui.viewmodels.MainViewModel.setDisplayMenu(MainViewModel.kt:54)
        at com.mgr.ui.viewmodels.MainViewModel.onMenuStateChange(MainViewModel.kt:40)
        at com.mgr.ui.viewmodels.MainViewModel.<init>(MainViewModel.kt:24)
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at androidx.lifecycle.SavedStateViewModelFactoryKt.newInstance(SavedStateViewModelFactory.kt:228)
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:133) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153) 
        at com.mgr.MainActivity.onCreate(MainActivity.kt:43) 
        at android.app.Activity.performCreate(Activity.java:8290) 
        at android.app.Activity.performCreate(Activity.java:8269) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3657) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2308) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:201) 
        at android.os.Looper.loop(Looper.java:288) 
        at android.app.ActivityThread.main(ActivityThread.java:7898) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 

编辑:传递给单独的 @Composable 方法.

代码语言:javascript
复制
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun Main(viewModel: MainViewModel = androidx.lifecycle.viewmodel.compose.viewModel()) {
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-31 19:19:14

代码语言:javascript
复制
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void androidx.compose.runtime.MutableState.setValue(java.lang.Object)' on a null object reference

您可以尝试将init {}块移动到声明displayMenu之后。我不相信这会奏效,但值得一试。

如果这没有帮助,那么您可能需要将SavedStateHandle的使用推迟到MutableState准备使用的某个时候。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73185990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档