在 NavDirections 中找不到 safeargs 参数
safeargs argument not found in NavDirections
我已经实现了在 nav_graph 中的片段之间传递的参数,但是当我尝试在原始片段中设置参数时,NavDirections 找不到该参数。
请注意,在尝试传递参数之前导航工作正常。
如果我做一个干净的项目,我会失去 NavDirections。如果我进行重建,我将失去争论。
Gradle:应用程序
//Navigation
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
apply plugin: "androidx.navigation.safeargs.kotlin"
nav_graph.xml
<fragment
android:id="@+id/destination_home"
android:name="com.android.joncb.flightlogbook.HomeFragment"
android:label="@string/lblHome"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_home_to_fltHistory"
app:destination="@id/destination_fltHistory" />
<action
android:id="@+id/action_home_to_stats"
app:destination="@id/destination_statistics" />
<action
android:id="@+id/action_home_to_newFlight"
app:destination="@id/destination_newFlight" />
<action
android:id="@+id/action_home_to_fltDetails"
app:destination="@id/destination_fltDetails" />
<argument
android:name="fltData"
app:argType="string" />
</fragment>
在我的 Home Fragment 中我收到错误 "Unresolved reference: fltData"
card_nextFlight.setOnClickListener {
val actionDetails = HomeFragmentDirections.actionHomeToFltDetails()
actionDetails.fltData ( flightData.toString())
Navigation.findNavController(it).navigate(actionDetails)
}
flightData 是一个数据 class
data class FlightDTO(
var airlineName: String, var faCode: String, var fltNo: String, var aircraft: String,
var depAP: String, var arrAP: String, var schedDep: String, var schedArr: String,
var date: String, var leg: Int = 0, var actDep: String = "", var actArr: String = "" ){
...
override fun toString(): String {
return "$airlineName $faCode $fltNo $aircraft $depAP $schedDep $arrAP $schedDep $date"
}
}
我想通过 class Parcelable 来理想地传递 class,但是在我可以传递字符串之前,没有必要冒险沿着包裹线前进。
你写的 XML 错了,这样想:我构建我的 XML 属性的方式是生成的代码在目的地之间看起来和接收的方式 有点...
所以基本上在您的 nav_graph.xml 中您应该更改为:
<fragment
android:id="@+id/destination_home"
android:name="com.android.joncb.flightlogbook.HomeFragment"
android:label="@string/lblHome"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_home_to_fltHistory"
app:destination="@id/destination_fltHistory" />
<action
android:id="@+id/action_home_to_stats"
app:destination="@id/destination_statistics" />
<action
android:id="@+id/action_home_to_newFlight"
app:destination="@id/destination_newFlight" />
<action
android:id="@+id/action_home_to_fltDetails"
app:destination="@id/destination_fltDetails">
<argument
android:name="fltData"
app:argType="string" />
</action>
</fragment>
在您的目的地,它应该类似于:
<fragment
android:id="@+id/destination_fltDetails"
android:name="com.android.joncb.flightlogbook.FlightDetailsFragment"
android:label="@string/lblFlightDetails"
tools:layout="@layout/fragment_flight_details">
<argument
android:name="fltData"
app:argType="string" />
</fragment>
在您的航班详细信息片段中,属性是通过以下方式接收的:
private val args: FlightDetailsFragmentArgs by navArgs()
println(args.fltData) // prints the navigation data
更新:
忘记在您的主页片段中提及您的 OnClickListener,它看起来更像这样:
card_nextFlight.setOnClickListener {
val actionDetails = HomeFragmentDirections.actionHomeToFltDetails(flightData.toString())
Navigation.findNavController(it).navigate(actionDetails)
}
我没有传递数据 class,而是创建了一个 JSON 字符串并传递了一个字符串
card_nextFlight.setOnClickListener {
val dataString = flightData.toJSONString()
val actionDetails = HomeFragmentDirections.actionHomeToFltDetails(dataString)
Navigation.findNavController(it).navigate(actionDetails)
}
为了让它工作,我必须修改 actionHomeToFltDetails 函数以在 HomeFragmentsDirections
中接收一个字符串
fun actionHomeToFltDetails(fltData: String): NavDirections = ActionHomeToFltDetails(fltData)
}
我无法使用@Lucho 方法来处理目标片段中的 arg,因此恢复为包管理,并将 JSON 字符串转换回数据 class
const val ARG_PARAM1 = "fltData"
.
.
.
arguments?.let {
argFltData = it.getString(ARG_PARAM1)
Log.e("args","Passed Argument: $argFltData")
fltData = gson.fromJson(argFltData, FlightDTO::class.java)
}
再次感谢您的意见,我希望这对其他人有帮助。
我的错误如下。我有类似的东西
NavDirections action =
SpecifyAmountFragmentDirections
.actionSpecifyAmountFragmentToConfirmationFragment();
我改成了
ConfirmationAction action =
SpecifyAmountFragmentDirections
.actionSpecifyAmountFragmentToConfirmationFragment();
就我而言,我写了一个这样的错误代码 -
NavController navController = NavHostFragment.findNavController(this);
NavDirections navDirections = MyDestinationFragmentDirections.actionMyAction(myArgumentValue);
navController.navigate(navDirections.getActionId());
然后我把最后一行改成这个-
navController.navigate(navDirections);
最后,它按预期工作了!!!
这背后的逻辑是,在 NavController
class 中接受 int (resId
of action) 的方法总是把空参数-
public void navigate(@IdRes int resId) {
navigate(resId, null);
}
所以我们应该使用-
public void navigate(@NonNull NavDirections directions) {
navigate(directions.getActionId(), directions.getArguments());
}
如果我们愿意通过操作传递参数的方法。
我已经实现了在 nav_graph 中的片段之间传递的参数,但是当我尝试在原始片段中设置参数时,NavDirections 找不到该参数。
请注意,在尝试传递参数之前导航工作正常。
如果我做一个干净的项目,我会失去 NavDirections。如果我进行重建,我将失去争论。
Gradle:应用程序
//Navigation
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
apply plugin: "androidx.navigation.safeargs.kotlin"
nav_graph.xml
<fragment
android:id="@+id/destination_home"
android:name="com.android.joncb.flightlogbook.HomeFragment"
android:label="@string/lblHome"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_home_to_fltHistory"
app:destination="@id/destination_fltHistory" />
<action
android:id="@+id/action_home_to_stats"
app:destination="@id/destination_statistics" />
<action
android:id="@+id/action_home_to_newFlight"
app:destination="@id/destination_newFlight" />
<action
android:id="@+id/action_home_to_fltDetails"
app:destination="@id/destination_fltDetails" />
<argument
android:name="fltData"
app:argType="string" />
</fragment>
在我的 Home Fragment 中我收到错误 "Unresolved reference: fltData"
card_nextFlight.setOnClickListener {
val actionDetails = HomeFragmentDirections.actionHomeToFltDetails()
actionDetails.fltData ( flightData.toString())
Navigation.findNavController(it).navigate(actionDetails)
}
flightData 是一个数据 class
data class FlightDTO(
var airlineName: String, var faCode: String, var fltNo: String, var aircraft: String,
var depAP: String, var arrAP: String, var schedDep: String, var schedArr: String,
var date: String, var leg: Int = 0, var actDep: String = "", var actArr: String = "" ){
...
override fun toString(): String {
return "$airlineName $faCode $fltNo $aircraft $depAP $schedDep $arrAP $schedDep $date"
}
}
我想通过 class Parcelable 来理想地传递 class,但是在我可以传递字符串之前,没有必要冒险沿着包裹线前进。
你写的 XML 错了,这样想:我构建我的 XML 属性的方式是生成的代码在目的地之间看起来和接收的方式 有点...
所以基本上在您的 nav_graph.xml 中您应该更改为:
<fragment
android:id="@+id/destination_home"
android:name="com.android.joncb.flightlogbook.HomeFragment"
android:label="@string/lblHome"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_home_to_fltHistory"
app:destination="@id/destination_fltHistory" />
<action
android:id="@+id/action_home_to_stats"
app:destination="@id/destination_statistics" />
<action
android:id="@+id/action_home_to_newFlight"
app:destination="@id/destination_newFlight" />
<action
android:id="@+id/action_home_to_fltDetails"
app:destination="@id/destination_fltDetails">
<argument
android:name="fltData"
app:argType="string" />
</action>
</fragment>
在您的目的地,它应该类似于:
<fragment
android:id="@+id/destination_fltDetails"
android:name="com.android.joncb.flightlogbook.FlightDetailsFragment"
android:label="@string/lblFlightDetails"
tools:layout="@layout/fragment_flight_details">
<argument
android:name="fltData"
app:argType="string" />
</fragment>
在您的航班详细信息片段中,属性是通过以下方式接收的:
private val args: FlightDetailsFragmentArgs by navArgs()
println(args.fltData) // prints the navigation data
更新:
忘记在您的主页片段中提及您的 OnClickListener,它看起来更像这样:
card_nextFlight.setOnClickListener {
val actionDetails = HomeFragmentDirections.actionHomeToFltDetails(flightData.toString())
Navigation.findNavController(it).navigate(actionDetails)
}
我没有传递数据 class,而是创建了一个 JSON 字符串并传递了一个字符串
card_nextFlight.setOnClickListener {
val dataString = flightData.toJSONString()
val actionDetails = HomeFragmentDirections.actionHomeToFltDetails(dataString)
Navigation.findNavController(it).navigate(actionDetails)
}
为了让它工作,我必须修改 actionHomeToFltDetails 函数以在 HomeFragmentsDirections
中接收一个字符串 fun actionHomeToFltDetails(fltData: String): NavDirections = ActionHomeToFltDetails(fltData)
}
我无法使用@Lucho 方法来处理目标片段中的 arg,因此恢复为包管理,并将 JSON 字符串转换回数据 class
const val ARG_PARAM1 = "fltData"
.
.
.
arguments?.let {
argFltData = it.getString(ARG_PARAM1)
Log.e("args","Passed Argument: $argFltData")
fltData = gson.fromJson(argFltData, FlightDTO::class.java)
}
再次感谢您的意见,我希望这对其他人有帮助。
我的错误如下。我有类似的东西
NavDirections action =
SpecifyAmountFragmentDirections
.actionSpecifyAmountFragmentToConfirmationFragment();
我改成了
ConfirmationAction action =
SpecifyAmountFragmentDirections
.actionSpecifyAmountFragmentToConfirmationFragment();
就我而言,我写了一个这样的错误代码 -
NavController navController = NavHostFragment.findNavController(this);
NavDirections navDirections = MyDestinationFragmentDirections.actionMyAction(myArgumentValue);
navController.navigate(navDirections.getActionId());
然后我把最后一行改成这个-
navController.navigate(navDirections);
最后,它按预期工作了!!!
这背后的逻辑是,在 NavController
class 中接受 int (resId
of action) 的方法总是把空参数-
public void navigate(@IdRes int resId) {
navigate(resId, null);
}
所以我们应该使用-
public void navigate(@NonNull NavDirections directions) {
navigate(directions.getActionId(), directions.getArguments());
}
如果我们愿意通过操作传递参数的方法。