使用Jetpack Navigation首次加载Fragment时如何让arguments为null
问题原因
你遇到的首次加载时arguments不为空的现象是Jetpack Navigation组件的默认行为导致的:
只要你在NavGraph的目的地<fragment>节点下声明了<argument>标签,无论你是否给参数配置了默认值,Navigation组件实例化该目的地时都会自动创建一个非空的Bundle对象用于存放参数值。你给argument设置的默认值是@null,所以最终拿到的就是一个没有实际有效值的空Bundle,而非null。
解决方案
方案1(推荐):将参数声明移动到自跳转Action下
你的参数仅在自跳转场景下需要传递,不需要作为Fragment的全局参数,直接把<argument>节点从<fragment>下挪到自跳转的<action>节点下即可。修改后的NavGraph配置如下:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_graph" app:startDestination="@id/homeFragment"> <fragment android:id="@+id/homeFragment" android:name="com.org.HomeFragment" android:label="Home" tools:layout="@layout/fragment_home" > <action android:id="@+id/action_homeFragment_self" app:destination="@id/homeFragment" app:enterAnim="@anim/nav_default_enter_anim" app:exitAnim="@anim/nav_default_exit_anim" > <!-- 参数移到此处 --> <argument android:name="argument" app:argType="string" app:nullable="true" android:defaultValue="@null" /> </action> </fragment> </navigation>
修改后首次作为起始目的地加载HomeFragment时,没有全局参数配置,arguments就会为null,只有触发自跳转动作时才会携带参数。
方案2:判断参数值而非Bundle本身
如果你需要保留Fragment级别的参数声明,不需要纠结Bundle是否为空,直接判断实际参数值即可:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val arg = arguments?.getString("argument") arg?.let { // 只有跳转过来有参数时才走这个逻辑 val test = it } // arg为null的情况就是首次加载的场景 }
这个方案改造成本最低,也符合Navigation的设计规范。
内容的提问来源于stack exchange,提问作者UnreachableCode
相关产品推荐
相关产品推荐

