Android Fragments 无法使用导航组件访问具有可空参数的片段[duplicate]

a1o7rhls  于 2022-12-04  发布在  Android
关注(0)|答案(1)|浏览(167)

此问题在此处已有答案

can I send nullable data type as argument using safeargs ? if not what should I do?(1个答案)
8小时前关门。
我的OrdersFragment有一个称为Option的可空参数:

<argument
            android:name="option"
            app:argType="string"
            app:nullable="true" />

为了使用可为空的参数,我在onViewCreated方法的上面以这种方式声明了一个变量

private val args : OrdersFragmentArgs? by navArgs()

在这个片段的onViewCreated中,我有:

args?.let {

            if(it.option.equals("Completada")){
                getCompletedOrders()
            }else if (it.option.equals("Cancelada")){
                getCanceledOrders()
            }
        }

然后,当我编译应用程序并转到ordesFragment时,应用程序崩溃:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.elrestaurante, PID: 3388
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:581)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) 
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:54)
        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:35)
        at com.example.elrestaurante.ui.orders.OrdersFragment.getArgs(OrdersFragment.kt:62)
        at com.example.elrestaurante.ui.orders.OrdersFragment.onViewCreated(OrdersFragment.kt:83)
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3128)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1890)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1814)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1751)
        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:538)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:226)
        at android.os.Looper.loop(Looper.java:313)
        at android.app.ActivityThread.main(ActivityThread.java:8669)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) 
     Caused by: java.lang.IllegalArgumentException: Required argument "option" is missing and does not have an android:defaultValue
        at com.example.elrestaurante.ui.orders.OrdersFragmentArgs.fromBundle(OrdersFragmentArgs.java:36)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:54) 
        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:35) 
        at com.example.elrestaurante.ui.orders.OrdersFragment.getArgs(OrdersFragment.kt:62) 
        at com.example.elrestaurante.ui.orders.OrdersFragment.onViewCreated(OrdersFragment.kt:83) 
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3128) 
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552) 
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261) 
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1890) 
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1814) 
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1751) 
        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:538) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loopOnce(Looper.java:226) 
        at android.os.Looper.loop(Looper.java:313) 
        at android.app.ActivityThread.main(ActivityThread.java:8669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) 
I/Process: Sending signal. PID: 3388 SIG: 9

错误指向条件参数?.let {...我不知道该怎么做,请亲爱的,如果你有一些想法来解决这个问题,我将不胜感激。
我只是想将一个名为option的参数从“EditOrderFragment”发送到“OrdersFragment”,但现在我无法访问OrdersFragment,我不知道为什么会发生这个错误,也许是一个bug?
非常感谢。
PD:我使用的是以下版本:

id 'androidx.navigation.safeargs' version '2.5.3' apply false

    //Navigation components
    implementation "androidx.navigation:navigation-fragment-ktx:2.5.0"
    implementation "androidx.navigation:navigation-ui-ktx:2.5.0"
7rfyedvj

7rfyedvj1#

在Android中使用导航组件时,您可以将参数传递给目标片段。但是,如果参数可为空,则在尝试访问片段时会出现错误。
要解决这个问题,你可以使用Bundle对象代替可空参数。你可以将参数(选项)存储在一个包中,然后将该包传递给目标片段。这样,你就可以确保参数不为空,并且可以安全地传递给目标片段。
例如,您可以执行下列动作:

//Store the parameter in a bundle
val bundle = Bundle()
bundle.putString("option", option)

//pass the bundle to the destination fragment
navController.navigate(R.id.ordersFragment, bundle)

这样,您就可以将参数(选项)安全地传递到目标片段。

相关问题