我希望你们都做得很好。
我有一个小问题;
我正在使用导航组件,单个活动多个片段。我对深层链接有一个小问题。
我已经<nav-graph/>在清单中设置了并且还设置了 launcherMode="singleTask",
我已经<deeplink/>在导航图中设置了。
我已经在片段中处理了意图附加内容。
我的流程是;
问题是; 有时如果应用程序在后台打开(例如我请求邮件然后按下主页按钮)并且当我单击深层链接时,最后一个片段运行而不是目标片段,即 CreatePasswordFragment 关于可能导致问题的任何想法?
谢谢!
导航版本:2.2.0
电子邮件附带的深层链接
http://myurl/forgot-password/?key=sodmoq9wwdW1djkssdqMEdqlsp
Run Code Online (Sandbox Code Playgroud)
导航图
<deepLink android:id="@+id/deepLink"
app:uri="http://myurl/forgot-password/?key={key}"/>
<argument
android:name="key"
app:argType="string" />
Run Code Online (Sandbox Code Playgroud)
安卓清单
<activity
...
android:launchMode="singleTask">
<nav-graph android:value="@navigation/navigation_main" />
</activity>`
Run Code Online (Sandbox Code Playgroud)
反编译清单
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http" />
<data android:host="myurl" />
<data android:path="/forgot-password/" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud) 我正在我当前正在从事的项目中使用导航组件。问题是,当我同时单击两个项目时,会导致findNavController.navigate()被调用两次。所以它抛出IllegalArgumentException: navigation destination is unknown to this NavController. 我认为它会到达目的地,然后尝试在没有目标目的地的目的地中第二次触发。目的地接待...
有没有办法检查当前片段是否已指定目的地?
现在我已经用下面的代码解决了问题,但它看起来不正确。
fun NavController.navigateSafe(direction: NavDirections) {
try {
navigate(direction)
} catch (exception: IllegalArgumentException) {
Log.e("NavigationExtensions", exception.message.orEmpty())
}
}
Run Code Online (Sandbox Code Playgroud)
更新
感谢@Md.Asaduzzaman 分享的链接帮助了我。解决方案是;
fun NavController.navigateSafe(direction: NavDirections) {
currentDestination?.getAction(direction.actionId)?.let { navigate(direction) }
}
Run Code Online (Sandbox Code Playgroud) navigation android android-jetpack android-architecture-navigation