You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Jetpack Compose认证后如何使用NavigationSuiteScaffold

解决方案

关于NavigationSuiteScaffold是否作为主Scaffold

是的,登录成功后的主页场景下,NavigationSuiteScaffold应该作为主Scaffold。它本身就是为底部导航类场景设计的,内置了底部导航栏管理、内容区域导航切换逻辑,无需额外嵌套其他Scaffold。而登录界面属于独立前置页面,直接用普通Scaffold或自定义布局即可,不需要依赖NavigationSuiteScaffold。

完整实现流程

1. 全局登录状态管理

用ViewModel配合StateFlow跟踪登录状态,确保状态在界面间共享:

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch

class AuthViewModel : ViewModel() {
    private val _isLoggedIn = MutableStateFlow(false)
    val isLoggedIn: StateFlow<Boolean> = _isLoggedIn

    fun login(username: String, password: String) {
        // 替换为实际登录验证逻辑(如API调用)
        viewModelScope.launch {
            // 模拟登录成功
            _isLoggedIn.value = true
        }
    }
}

2. 登录界面实现

用普通Scaffold搭建登录页,包含输入框和登录触发逻辑:

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Button
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun LoginScreen(authViewModel: AuthViewModel = viewModel()) {
    var username by remember { mutableStateOf("") }
    var password by remember { mutableStateOf("") }

    Scaffold { padding ->
        Column(
            modifier = androidx.compose.ui.Modifier
                .fillMaxSize()
                .padding(padding),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            OutlinedTextField(
                value = username,
                onValueChange = { username = it },
                label = { Text("用户名") },
                keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
            )
            OutlinedTextField(
                value = password,
                onValueChange = { password = it },
                label = { Text("密码") },
                keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
                modifier = androidx.compose.ui.Modifier.padding(top = 8.dp)
            )
            Button(
                onClick = { authViewModel.login(username, password) },
                modifier = androidx.compose.ui.Modifier.padding(top = 16.dp)
            ) {
                Text("登录")
            }
        }
    }
}

3. 主页(NavigationSuiteScaffold)实现

先定义4个底部导航对应的页面,再配置NavigationSuiteScaffold的导航项和内容切换逻辑:

import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Notifications
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.Settings

// 定义4个目标页面
@Composable
fun HomeScreen() {
    Text("首页内容")
}

@Composable
fun ProfileScreen() {
    Text("个人中心内容")
}

@Composable
fun SettingsScreen() {
    Text("设置页面内容")
}

@Composable
fun NotificationsScreen() {
    Text("消息通知内容")
}

// 主页布局
@Composable
fun MainScreen() {
    val navigationItems = listOf(
        NavigationSuiteItem(
            label = "首页",
            icon = Icons.Filled.Home,
            route = "home"
        ),
        NavigationSuiteItem(
            label = "个人中心",
            icon = Icons.Filled.Person,
            route = "profile"
        ),
        NavigationSuiteItem(
            label = "设置",
            icon = Icons.Filled.Settings,
            route = "settings"
        ),
        NavigationSuiteItem(
            label = "消息",
            icon = Icons.Filled.Notifications,
            route = "notifications"
        )
    )

    NavigationSuiteScaffold(
        navigationItems = navigationItems,
        initialRoute = "home"
    ) { route ->
        when (route) {
            "home" -> HomeScreen()
            "profile" -> ProfileScreen()
            "settings" -> SettingsScreen()
            "notifications" -> NotificationsScreen()
        }
    }
}

4. 主入口界面切换

在App主Compose函数中,根据登录状态自动切换显示登录页或主页:

import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun MyApp() {
    val authViewModel = viewModel<AuthViewModel>()
    val isLoggedIn by authViewModel.isLoggedIn.collectAsState()

    if (isLoggedIn) {
        MainScreen()
    } else {
        LoginScreen()
    }
}

内容的提问来源于stack exchange,提问作者zerstoer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:18:10