标签: jetpack-compose-navigation

如何从 Compose-Navigation 的返回堆栈中删除可组合项

我的应用程序中有一个屏幕,允许用户编辑数据库中的项目,在用户完成编辑项目后,他们单击“完成”按钮,将他们带到上一个屏幕。但是当用户单击后退按钮时,他们将再次进入编辑屏幕。

我想要的是当用户单击后退按钮时转到另一个屏幕,就像他们从未去过编辑屏幕一样。

这是我的导航图:

@Composable
fun AppNavigator(
    textFieldsViewModel: TextFieldsViewModel,
    shoppingListsViewModel: ShoppingListsViewModel,
    addNewShoppingListViewModel: AddNewShoppingListViewModel
) {

    val navController = rememberNavController()

    NavHost(navController, startDestination = "SplashScreen") {
        composable("SplashScreen") {
            SplashScreen(navController = navController)
        }
        composable("shoppingLists") {
            ShoppingListsScreen(
                navController = navController,
                shoppingListsViewModel = shoppingListsViewModel,
                textFieldsViewModel = textFieldsViewModel
            )
        }
        composable(
            "ItemsList/{listID}",
            arguments = listOf(navArgument("listID") { type = NavType.IntType })
        ) {
            ShoppingListItemsScreen(
                it.arguments?.getInt("listID")!!,
                shoppingListsViewModel = shoppingListsViewModel,
                textFieldsViewModel = textFieldsViewModel,
                navController = navController
            )
        }
        composable(
            "EditItem/{itemId},{itemName},{itemQuantity},{itemParentListId}",
            arguments = listOf(
                navArgument("itemId") { type = NavType.IntType },
                navArgument("itemName") …
Run Code Online (Sandbox Code Playgroud)

kotlin android-jetpack android-architecture-navigation android-jetpack-compose jetpack-compose-navigation

4
推荐指数
1
解决办法
4242
查看次数

在 Compose 中使用 SavedStateHandle 传递整数导航参数时发生投射错误

我正在尝试从第一个屏幕导航到第二个屏幕,并且我需要提供一个整数标识符来从第二个屏幕上的 API 加载内容。

我在尝试传递 Int Nav 参数时遇到此错误。

java.lang.ClassCastException:java.lang.String无法转换为java.lang.Integer

这是我的 NavHost,我将/{recipeId}其用作第二个屏幕路线上的占位符。

            NavHost(
                    navController = navController,
                    startDestination = Screens.RecipesOverviewScreen.route
                ) {

                    //1st Screen
                    composable(route = Screens.RecipesOverviewScreen.route) {

                        RecipesOverviewScreen(
                            navController = navController,
                            onToggleTheme = { app.toggleLightTheme() })
                    }

                    //2nd Screen
                    composable(route = "${Screens.RecipeDetailScreen.route}/{recipeId}")
                    {
                        RecipeDetailScreen()
                    }
Run Code Online (Sandbox Code Playgroud)

然后,我调用navController.navigate()第一个屏幕,将idInt 类型传递到导航路线中。

RecipeList(recipes = listState.recipes,
                    onClickRecipeCard = { id ->
                    
                        //insert corresponding Int id into the Nav route
                        navController.navigate(
                        route = "${Screens.RecipeDetailScreen.route}/${id}"
     
                        )
                    }
Run Code Online (Sandbox Code Playgroud)

在第二个屏幕的 ViewModel 中,我使用 SavedHandleInstance 检索 nav 参数。 …

android android-jetpack-compose jetpack-compose-navigation

4
推荐指数
1
解决办法
1581
查看次数

如果在 android jetpack 中选择和取消选择图标,如何更改导航栏的图标,就像我们在 xml 中用于选择状态的选择器一样?

我想使用基于导航栏中所选状态的轮廓和填充图标,就像谷歌地图应用程序一样,使用jetpack compose。如果是 xml,我们使用选择器,那么我们使用什么来进行 compose 呢?

这是我的代码->

MainActivity.kt

@ExperimentalMaterial3Api
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Handle the splash screen transition.
        installSplashScreen()
        setContent {
            MyApp()
        }
    }
}

@ExperimentalMaterial3Api
@Composable
fun MyApp() {
    MyTheme {
        val items = listOf(
            Screen.HomeScreen,
            Screen.MusicScreen,
            Screen.ProfileScreen
        )
        val navController = rememberNavController()
        Scaffold(
            bottomBar = {
                NavigationBar {
                    val navBackStackEntry by navController.currentBackStackEntryAsState()
                    val currentDestination = navBackStackEntry?.destination
                    items.forEach { screen ->
                        NavigationBarItem(
                            icon = {
                                Icon(
                                    screen.icon_outlined,
                                    contentDescription = screen.label.toString()
                                )
                            }, …
Run Code Online (Sandbox Code Playgroud)

android material-components-android android-jetpack-compose android-jetpack-compose-scaffold jetpack-compose-navigation

4
推荐指数
1
解决办法
4036
查看次数

如何从子可组合项控制脚手架的 FloatingActionButton onClick?

是否可以从可组合的屏幕(也在 aFloatingActionButton内部)设置 aonClick内部的值?在我的示例中,我希望能够更改 FAB 的 onClick 以根据屏幕可组合项内的值 ( ) 进行一些计算,而不将该值提升到该值所在的可组合项( )。ScaffoldNavHostScaffoldnameScaffoldMyActivity()

@Composable
fun MyActivity() {
    val navController = rememberNavController()

    Scaffold(
        floatingActionButton = {
            FloatingActionButton(onClick = { /* set this lambda from Screen1 */ }) { ... }
        }
    ) { paddingValues ->
        NavHost(
            navController = navController,
            startDestination = Screen.Screen1.route,
            modifier = Modifier.padding(paddingValues)
        ) {
            composable(route = Screen.Screen1.route) {
                Screen1()
            }
            ...
        }
    }
}

@Composable
fun Screen1() {
    var name …
Run Code Online (Sandbox Code Playgroud)

android-navigation android-jetpack-compose jetpack-compose-navigation

4
推荐指数
1
解决办法
1912
查看次数

如何将 AlertDialog 与 Jetpack Compose 中的导航组件集成?

我正在使用 Jetpack Compose 和 Android 导航组件。当我在带有 的屏幕上时AlertDialog,我无法返回。我猜这是由于AlertDialog捕获了后退按钮事件。但是我不知道如何连接AlertDialog到导航组件?有没有官方的方法或最佳实践来做到这一点?这是我的代码:

// sample with a screen and a "navigate to dialog" button.
// once the button is pressed, an AlertDialog is shown.
// Using the back button while the AlertDialog is open has no effect ):    

@Composable
fun MyNavHost(navController: NavHostController, modifier: Modifier = Modifier) {
    NavHost(
        navController = navController,
        startDestination = "start_route",
        modifier = modifier
    ) {
        composable("start_route") {
            Text("start screen")
        }
        
        // this is my screen with …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-navigation android-jetpack-compose jetpack-compose-navigation navigation-compose

4
推荐指数
1
解决办法
1780
查看次数

Jetpack Compose Navigation 无限加载屏幕

我正在尝试Navigation使用单个活动和多个Composable屏幕来实现。

这是我的NavHost

@Composable
@ExperimentalFoundationApi
fun MyNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),
    startDestination: String = HOME.route,
    viewModelProvider: ViewModelProvider,
    speech: SpeechHelper
) = NavHost(
    modifier = modifier,
    navController = navController,
    startDestination = startDestination
) {
    composable(route = HOME.route) {
        with(viewModelProvider[HomeViewModel::class.java]) {
            HomeScreen(
                speech = speech,
                viewModel = this,
                modifier = Modifier.onKeyEvent { handleKeyEvent(it, this) }
            ) {
                navController.navigateTo(it)
            }
        }
    }

    composable(route = Destination.VOLUME_SETTINGS.route) {
        VolumeSettingsScreen(
            viewModelProvider[VolumeSettingsViewModel::class.java]
        ) { navController.navigateUp() }
    }
} …
Run Code Online (Sandbox Code Playgroud)

android infinite-loop android-jetpack-compose jetpack-compose-navigation compose-recomposition

4
推荐指数
1
解决办法
1879
查看次数

Jetpack Compose BottomNavBar 标签重叠 图标

我试图实现 jetpack compose 底部导航栏。但我遇到了这个问题。每当标签没有足够的空间时,它就会与图标重叠。我错过了什么吗?有没有自动截断或缩小文本之类的解决方案?

compose_version = '1.0.0-beta09'

[1]:https://i.stack.imgur.com/gmD34.png

我的代码

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val navController = rememberNavController()
            val items = listOf(
                Screen.Profile,
                Screen.FriendsList,
                Screen.Notification,
                Screen.Setting
            )

            Scaffold(
                bottomBar = {
                    BottomNavigation(
                        backgroundColor = MaterialTheme.colors.surface,
                        elevation = 8.dp
                    ) {
                        val navBackStackEntry by navController.currentBackStackEntryAsState()
                        val currentRoute = navBackStackEntry?.destination?.route
                        items.forEachIndexed { index, screen ->
                            BottomNavigationItem(
                                icon = {
                                    when (index) {
                                        0 -> Icon(Icons.Filled.Person, "Profile")
                                        1 -> Icon(
                                            painterResource(id = R.drawable.ic_friends),
                                            "Friends"
                                        )
                                        2 -> Icon(Icons.Filled.Notifications, "Notification")
                                        else -> …
Run Code Online (Sandbox Code Playgroud)

android android-bottomnav android-jetpack-compose jetpack-compose-navigation

3
推荐指数
1
解决办法
1984
查看次数

撰写导航后退按钮未显示

我正在尝试在此SO 线程之后设置导航后退按钮,但无法使其工作。

@ExperimentalFoundationApi
@Composable
fun LazyVerticalGridActivityScreen() {
    val navController = rememberNavController()

    val navigationIcon: (@Composable () -> Unit)? =
        if (navController.previousBackStackEntry != null) {
            {
                IconButton(onClick = { navController.popBackStack() }) {
                    Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = null)
                }
            }
        } else {
            null
        }

    Scaffold(
        topBar = {
            TopAppBar(title = { Text("Lazy Vertical Grid") }, navigationIcon = navigationIcon)
        },
        content = {
            NavHost(navController = navController, startDestination = "home") {
                composable("home") { HomeScreen(navController) }
                composable("details/{listId}") { backStackEntry ->
                    backStackEntry.arguments?.getString("listId")
                        ?.let { …
Run Code Online (Sandbox Code Playgroud)

kotlin android-jetpack-compose jetpack-compose-navigation

3
推荐指数
1
解决办法
1953
查看次数

Android Jetpack Compose 导航中的依赖性问题

我正在探索文档中指定的撰写导航。

添加文档中指定的版本的依赖项2.4.0-alpha07会出现以下错误,

错误1

检查 AAR 元数据值时发现的一个或多个问题:

依赖项的 AAR 元数据 (META-INF/com/android/build/gradle/aar-metadata.properties) 中指定的 minCompileSdk (31) 大于此模块的compileSdkVersion (android-30)。依赖项:androidx.navigation:navigation-compose:2.4.0-alpha07。AAR 元数据文件:/Users/abhimanyu/.gradle/caches/transforms-3/0575ff5712e0a9c15b8d7424501c07b8/transformed/jetified-navigation-compose-2.4.0-alpha07/META-INF/com/android/build/gradle/aar-metadata。特性。

这个错误迫使我将我的应用程序从 30 升级到 31 compileSdkVersiontargetSdkVersion

升级版本出现这个错误,

错误2

清单合并失败:针对 Android 12 及更高版本的应用需要android: exported在相应组件定义了意图过滤器时指定显式值。有关详细信息,请参阅https://developer.android.com/guide/topics/manifest/activity-element#exported 。

为了解决这个问题,检查了这篇文章

即使添加后android:exported,我也收到相同的错误(错误2)。

compileSdkVersion升级到31是强制的吗?

如果是,如何解决错误2。如果否,如何解决错误1?

如果可能的话,我个人更喜欢坚持使用 SDK 30。

android android-jetpack-compose jetpack-compose-navigation

3
推荐指数
1
解决办法
6083
查看次数

使用 AnimatedNavHost 时屏幕上不显示任何内容

我正在使用 Accompanist 动画库:

implementation "com.google.accompanist:accompanist-navigation-animation:0.24.0-alpha"
Run Code Online (Sandbox Code Playgroud)

我有以下 AnimatedNavHost:

val navController = rememberAnimatedNavController()
AnimatedNavHost(
    navController = navController,
    startDestination = "auth",
    enterTransition = { EnterTransition.None },
    exitTransition = { ExitTransition.None }
) {
    composable(
        route = "auth"
    ) {
        AuthScreen(
            navController = navController
        )
    }
    composable(
        route = "profile"
    ) {
        ProfileScreen(
            navController = navController
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

我的 AuthScreen 很简单:

Box(
    modifier = Modifier.fillMaxSize().padding(bottom = 48.dp),
    contentAlignment = Alignment.BottomCenter
) {
    Button(
        onClick = {
            signIn()
        }
    ) {
        Text(
            text = …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose jetpack-compose-navigation

3
推荐指数
1
解决办法
1686
查看次数