Android 开发:基于Scaffold的电子邮件App

1 MainActivity.kt

kotlin 复制代码
package com.jinxuliang.mymailapp

import android.annotation.SuppressLint
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.jinxuliang.mymailapp.components.*
import com.jinxuliang.mymailapp.model.DrawMenuData
import com.jinxuliang.mymailapp.ui.theme.MyMailAppTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyMailAppTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    MyMailApp()
                }
            }
        }
    }
}

@SuppressLint("UnusedMaterialScaffoldPaddingParameter")
@Composable
fun MyMailApp() {

    val scaffoldState = rememberScaffoldState()
    val coroutineScope = rememberCoroutineScope()
    val scrollState = rememberScrollState()
    val openDialog=remember{
        mutableStateOf(false)
    }

    Scaffold(
        scaffoldState = scaffoldState,
        topBar = { HomeAppBar(scaffoldState, coroutineScope,openDialog) },
        drawerContent = {
            DrawerMenu(scrollState)
        },
        bottomBar = {
            HomeBottomMenu()
        },
        floatingActionButton = {
            MailFab()
        }) {
        MailList(it,scrollState)
    }
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    MyMailAppTheme {
        MyMailApp()
    }
}

这段代码是一个典型的 Jetpack Compose + Material Scaffold 架构应用入口

基础知识使用Scaffold脚手架函数


一、整体架构

入口是:

复制代码
MainActivity → setContent → MyMailAppTheme → MyMailApp()

核心 UI 在 MyMailApp()

👉 用了 Scaffold 布局骨架

复制代码
Scaffold
 ├── TopBar(顶部栏)
 ├── Drawer(侧边菜单)
 ├── BottomBar(底部导航)
 ├── FAB(悬浮按钮)
 └── Content(主内容 MailList)

二、重点:Scaffold 的作用

Scaffold 是 Material 设计里一个"页面模板容器",帮你管理常见布局:

kotlin 复制代码
Scaffold(
    scaffoldState = scaffoldState,
    topBar = { HomeAppBar(...) },
    drawerContent = { DrawerMenu(...) },
    bottomBar = { HomeBottomMenu() },
    floatingActionButton = { MailFab() }
) {
    MailList(it, scrollState)
}

👉 可以理解为:

"一个页面壳 + 你往里面填模块"


三、几个关键状态(重点理解)

1️⃣ scaffoldState

kotlin 复制代码
val scaffoldState = rememberScaffoldState()

作用:

  • 控制 Drawer(开/关)
  • 控制 Snackbar

👉 比如:

kotlin 复制代码
scaffoldState.drawerState.open()

2️⃣ coroutineScope

kotlin 复制代码
val coroutineScope = rememberCoroutineScope()

为什么要它?

👉 因为打开 Drawer 是 挂起函数(suspend)

kotlin 复制代码
coroutineScope.launch {
    scaffoldState.drawerState.open()
}

3️⃣ scrollState

kotlin 复制代码
val scrollState = rememberScrollState()

用于:

  • Drawer 滚动
  • MailList 滚动

4️⃣ openDialog(状态提升)

kotlin 复制代码
val openDialog = remember {
    mutableStateOf(false)
}

👉 用来控制弹窗是否显示

关键点:

  • remember 保存状态
  • mutableStateOf 实现响应式

四、参数传递

看这一句:

kotlin 复制代码
topBar = { HomeAppBar(scaffoldState, coroutineScope, openDialog) }

👉 说明:

  • AppBar 可以控制 Drawer
  • AppBar 可以打开 Dialog

👉 这是 状态提升(State Hoisting)


五、Scaffold content 里的 it 是什么?

kotlin 复制代码
MailList(it, scrollState)

这个 it 是:

👉 PaddingValues

用于避免内容被遮挡:

  • TopBar
  • BottomBar
  • FAB

正确写法应该在 MailList 里:

kotlin 复制代码
Modifier.padding(it)

六、你的代码结构(总结图)

复制代码
MyMailApp
 ├── 状态
 │    ├── scaffoldState
 │    ├── coroutineScope
 │    ├── scrollState
 │    └── openDialog
 │
 └── Scaffold
      ├── HomeAppBar(控制 Drawer + Dialog)
      ├── DrawerMenu(侧边栏)
      ├── HomeBottomMenu(底部)
      ├── MailFab(悬浮按钮)
      └── MailList(主内容)

2 MocData.kt

kotlin 复制代码
package com.jinxuliang.mymailapp

import com.jinxuliang.mymailapp.model.MailData

val mailList= listOf(
    MailData(
    mailId = 1,
    userName = "1userName",
    subject = "1Subject",
    body = "1body",
    timeStamp = "22:22"
),
    MailData(
        mailId = 2,
        userName = "2userName",
        subject = "2Subject",
        body = "2body",
        timeStamp = "22:22"
    )
,MailData(
        mailId = 3,
        userName = "3userName",
        subject = "3Subject",
        body = "3body",
        timeStamp = "22:22"
    )
,MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    )
    ,MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    ),MailData(
        mailId = 4,
        userName = "4userName",
        subject = "4Subject",
        body = "4body",
        timeStamp = "22:22"
    )
)
kotlin 复制代码
val mailList = listOf(...)

👉 定义了一个 不可变列表(List)

用途通常是:

kotlin 复制代码
LazyColumn {
    items(mailList) { mail ->
        MailItem(mail)
    }
}

👉 相当于"假数据 / Mock 数据"

相关推荐
终将老去的穷苦程序员4 分钟前
基于Android Studio开发的安卓图书借阅管理系统
java·sqlite·android studio·android-studio
林九生36 分钟前
【实用技巧】MySQL 绿色版一键路径更新脚本详解 —— update_path.bat 深度解析
android·数据库·mysql
故渊at2 小时前
第十三板块:Android 综合架构与未来演进 | 第三十一篇:Android 架构演进与 Fuchsia OS 的挑战
android·架构·宏内核·微内核·fuchsia·ipc 性能博弈
aqi002 小时前
一文速览 HarmonyOS 6.1.1 推出的十个新特性
android·华为·harmonyos·鸿蒙·harmony
matrixmind12 小时前
aiomysql:异步场景下的 MySQL 驱动
android·数据库·mysql·其他
随遇丿而安2 小时前
第8周:弹窗 / 提示组件全功能与弹窗优化
android
zh_xuan2 小时前
诡异Bug:输入框删除字符,却越删越多
android·bug
nwsuaf_huasir2 小时前
matlab绘制尺寸和字体合适的图片插入到latex的方法
android·开发语言·matlab
future_li2 小时前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android
杊页3 小时前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·操作系统