我在 Android 上使用最新版本的导航和撰写,但遇到一个错误,无法弹出导航的起始目的地。问题是,如果我有 3 个目的地(A、B、C)并从 A-> B -> C,我无法从后退堆栈中弹出 A,但当我调用时会弹出 B,导致后退popUpTo(B) inclusive = true按钮回到A。
我的代码:
导航主机
setContent {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "route_to_a"
) {
composable("route_to_a") {
LoginScreen(navController)
}
composable("route_to_b") {
RegisterScreen(navController)
}
composable("route_to_c") {
HomeScreen(navController = navController)
}
}
}
Run Code Online (Sandbox Code Playgroud)
导航
- A 到 B
Button(onClick = { navController.navigate("route_to_b")}) {}
Run Code Online (Sandbox Code Playgroud)
- B 到 C
Button(onClick = {
navController.navigate("route_to_c") {
popUpTo("route_to_b") {
inclusive = true
}
}
}) {}
Run Code Online (Sandbox Code Playgroud)
我想创建一个流程,其中 A 和 …
android android-layout android-jetpack-navigation android-jetpack-compose jetpack-compose-navigation
目前,我NavGraphs的应用程序中有两个,一个用于身份验证路由,例如登录和注册,另一个用于登录时的家庭路由。
当前,当我想使用它时,我需要navController在每个可组合项中将其作为参数传递。这绝对是不可扩展的,所以我想知道是否可以使其可注入,以便我可以通过 DI 框架(如Koin. 我目前正在Koin我的应用程序中使用,所以如果我可以使用它的依赖注入工具,将 anavController作为singleton.
我目前在navController内部创建MainActifity:
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavHostController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
startKoin {
androidLogger(if (BuildConfig.DEBUG) Level.ERROR else Level.NONE)
androidContext(this@MainActivity)
modules(listOf(networkModule, viewModelModule, interactorsModule))
}
setContent {
navController = rememberAnimatedNavController()
SetupNavGraph(navController = navController)
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将它传递到NavHost保存两个的NavGraphs:
fun SetupNavGraph(
navController: NavHostController
) {
AnimatedNavHost(
navController = navController,
startDestination = …Run Code Online (Sandbox Code Playgroud) kotlin koin android-jetpack-compose jetpack-compose-navigation
总之,我想根据单击的项目导航到目的地。
但问题是我创建这些项目的方式,这是我不知道如何隔离项目并为它们提供 onClick 函数的方式。
附言。我使用数据类和对象函数来制作项目;
data class MenuData(
Val id: Int,
Val title: String,
val menuImageId: Int = 0
)
Run Code Online (Sandbox Code Playgroud)
object MenuModel {
.....
fun menuModelList(context: Context) = listOf(
MenuData(
id = 1,
title = context.getString(R.string.menu_log),
description = context.getString(R.string.menu_logText),
menuImageId = R.drawable.menu_log
),
.....
)
}
Run Code Online (Sandbox Code Playgroud)
通常我所做的导航是(示例代码):
@Composable
fun WaysCard(
waysInfo: WaysData,
onWaysCardClick: (Int) -> Unit,
modifier: Modifier = Modifier
) {
Surface(
shape = MaterialTheme.shapes.small,
elevation = 10.dp,
modifier = modifier
.clickable { onWaysCardClick(waysInfo.id) }
)
....
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我为可组合项提供了一个单击函数,并将数据类作为参数传递,因为通常这些项目是通用的,它们的大部分内容都以类似的方式排列。 …
android kotlin android-jetpack-navigation android-jetpack-compose jetpack-compose-navigation
我有一个使用应在应用程序中打开的联合 URL 的应用程序。它使用 DeepLinks 来做到这一点。
问题是我需要向可组合项提供完整的 URI 模式,以便找出从哪里获取数据。我如何提供可组合项的完整 URL?
例子:
composable(
route = "c/{name}/{instance}",
deepLinks = DEFAULT_LEMMY_INSTANCES.map { instance ->
navDeepLink { uriPattern = "$instance/c/{name}" }
},
arguments = listOf(
navArgument("name") {
type = NavType.StringType
}
)
) {
LaunchedEffect(Unit) {
val name = it.arguments?.getString("name")!!
// TODO figure out how to get instance / full URI pattern?
Run Code Online (Sandbox Code Playgroud)