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

如何在Flutter中实现如图所示的UI界面

目标UI实现指导(根据你的截图)

一、UI核心结构拆解

先把截图中的界面拆分为3个核心模块,逐个实现更清晰:

  • 顶部日期切换栏:包含「今天」「明天」「本周」选项卡,当前选中项有高亮样式
  • 任务列表区:每条任务包含时间标签、任务标题、完成状态勾选框
  • 底部悬浮操作按钮:圆形添加按钮,用于触发新建任务操作

二、分平台实现示例

1. Android(Jetpack Compose)

顶部日期切换栏

用TabRow快速实现选项卡切换:

val tabs = listOf("今天", "明天", "本周")
var selectedTabIndex by remember { mutableStateOf(0) }

TabRow(selectedTabIndex = selectedTabIndex) {
    tabs.forEachIndexed { index, title ->
        Tab(
            text = { Text(title) },
            selected = selectedTabIndex == index,
            onClick = { selectedTabIndex = index },
            selectedContentColor = Color.Blue,
            unselectedContentColor = Color.Gray
        )
    }
}

任务列表项

自定义可复用的任务行组件:

data class Task(val time: String, val title: String, val isCompleted: Boolean)

@Composable
fun TaskItem(task: Task, onToggleCompleted: () -> Unit) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(
            text = task.time,
            modifier = Modifier.width(60.dp),
            color = Color.Gray
        )
        Text(
            text = task.title,
            modifier = Modifier.weight(1f),
            style = if (task.isCompleted) TextStyle(textDecoration = TextDecoration.LineThrough) else TextStyle()
        )
        Checkbox(
            checked = task.isCompleted,
            onCheckedChange = { onToggleCompleted() }
        )
    }
}

再用LazyColumn渲染任务列表:

val tasks = listOf(
    Task("09:00", "团队会议", false),
    Task("14:30", "项目评审", true),
    Task("16:00", "整理文档", false)
)

LazyColumn {
    items(tasks) { task ->
        TaskItem(task = task) {
            // 这里处理任务完成状态变更逻辑
        }
    }
}

底部悬浮按钮

用官方FloatingActionButton实现:

FloatingActionButton(
    onClick = { /* 打开新建任务页面 */ },
    modifier = Modifier
        .padding(16.dp)
        .align(Alignment.BottomEnd)
) {
    Icon(Icons.Default.Add, contentDescription = "添加任务")
}

2. iOS(SwiftUI)

顶部日期切换栏

用分段选择器实现:

struct ContentView: View {
    @State private var selectedTab = 0
    let tabs = ["今天", "明天", "本周"]
    
    var body: some View {
        Picker("", selection: $selectedTab) {
            ForEach(0..<tabs.count) { index in
                Text(tabs[index]).tag(index)
            }
        }
        .pickerStyle(.segmented)
        .padding()
    }
}

任务列表项

自定义任务行组件:

struct Task: Identifiable {
    let id = UUID()
    let time: String
    let title: String
    var isCompleted: Bool
}

struct TaskRow: View {
    var task: Task
    @Binding var isCompleted: Bool
    
    var body: some View {
        HStack {
            Text(task.time)
                .foregroundColor(.gray)
                .frame(width: 60)
            Text(task.title)
                .strikethrough(isCompleted)
                .foregroundColor(isCompleted ? .gray : .primary)
                .frame(maxWidth: .infinity, alignment: .leading)
            Toggle("", isOn: $isCompleted)
                .labelsHidden()
        }
        .padding(.vertical, 8)
        .padding(.horizontal)
    }
}

用List渲染任务列表:

@State private var tasks = [
    Task(time: "09:00", title: "团队会议", isCompleted: false),
    Task(time: "14:30", title: "项目评审", isCompleted: true),
    Task(time: "16:00", title: "整理文档", isCompleted: false)
]

List {
    ForEach($tasks) { $task in
        TaskRow(task: task, isCompleted: $task.isCompleted)
    }
}

底部悬浮按钮

用系统悬浮按钮组件(iOS 16+):

FloatingActionButton {
    // 打开新建任务页面
} label: {
    Image(systemName: "plus")
}
.padding()

三、通用优化要点

  • 屏幕适配:确保组件在不同尺寸设备上布局正常,可通过权重、自适应宽度实现
  • 状态同步:任务完成状态、选中的日期标签需绑定到状态变量,保证UI实时更新
  • 交互反馈:给选项卡切换、任务勾选、按钮点击添加轻微动画或高亮,提升体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:40:34