flet 应用默认不保存数据,关闭后任务丢失;可通过本地文件(如 json 或 txt)实现跨会话持久化,无需强制用户注册认证,适合初学者快速落地。
flet 应用默认不保存数据,关闭后任务丢失;可通过本地文件(如 json 或 txt)实现跨会话持久化,无需强制用户注册认证,适合初学者快速落地。
在使用 Flet 开发待办清单(To-Do List)这类状态型应用时,一个常见痛点是:用户添加的任务在关闭并重新启动应用后全部消失。这并非 Flet 的缺陷,而是因为所有数据默认仅驻留在内存中——程序终止即清空。好消息是,无需引入复杂的身份认证或后端服务,仅靠本地文件存储即可高效解决该问题,尤其适合学习阶段的 Python 开发者。
✅ 推荐方案:使用 JSON 文件持久化(简洁、安全、可读性强)
JSON 是最推荐的入门级持久化方式:结构清晰、标准库支持(无需额外安装)、天然适配 Python 字典/列表,且比纯文本更易扩展(例如后续支持多用户、完成状态、截止时间等字段)。
以下是一个完整、可直接运行的示例(基于 Flet 0.27+):
import flet as ft
import json
import os
# 定义数据文件路径
DATA_FILE = "tasks.json"
# 初始化数据:从文件读取,若不存在则创建空列表
def load_tasks():
if os.path.exists(DATA_FILE):
try:
with open(DATA_FILE, "r", encoding="utf-8") as f:
return json.load(f)
except (json.JSONDecodeError, OSError):
return []
return []
# 保存任务列表到文件
def save_tasks(tasks):
try:
with open(DATA_FILE, "w", encoding="utf-8") as f:
json.dump(tasks, f, ensure_ascii=False, indent=2)
except OSError as e:
print(f"⚠️ 保存失败:{e}")
def main(page: ft.Page):
page.title = "持久化待办清单"
page.padding = 20
# 加载已有任务
tasks = load_tasks()
# UI 控件
task_input = ft.TextField(hint_text="输入新任务...", expand=True)
task_list = ft.Column(scroll="auto", height=300)
# 渲染任务列表
def update_task_list():
task_list.controls.clear()
for i, task in enumerate(tasks):
cb = ft.Checkbox(label=task, value=False)
# 模拟“标记完成”逻辑(实际可绑定事件)
task_list.controls.append(cb)
page.update()
# 添加任务
def add_task(e):
if task_input.value.strip():
tasks.append(task_input.value.strip())
save_tasks(tasks) # ✅ 关键:立即写入磁盘
task_input.value = ""
update_task_list()
# 页面布局
page.add(
ft.Text("? 我的待办清单", size=24, weight="bold"),
ft.Row([task_input, ft.ElevatedButton("添加", on_click=add_task)]),
ft.Divider(),
task_list
)
# 首次加载显示任务
update_task_list()
ft.app(target=main)⚠️ 注意事项与最佳实践
- 自动保存优于定时保存:每次增删改操作后立即调用 save_tasks(),避免意外崩溃导致数据丢失;
- 异常防御:load_tasks() 中已包含 JSON 解析异常和文件读取异常处理,确保应用不会因损坏文件而崩溃;
- 编码统一:始终使用 encoding="utf-8",防止中文乱码;
- 路径可移植性:生产环境建议将 DATA_FILE 改为 pathlib.Path.home() / ".myapp" / "tasks.json",存入用户主目录更规范;
- 无需用户系统:本方案完全匿名,所有任务归属当前设备上的单个用户实例——正契合初学者需求。如未来需多账户支持,再扩展为 { "user1": [...], "user2": [...] } 结构即可;
- Web 端兼容性说明:Flet Web 应用运行在浏览器沙箱中,无法直接访问本地文件系统。此时需改用 flet.session.set() + 后端 API,或使用 localStorage(通过 page.client_storage)。但桌面端(flet app)完全支持上述 JSON 方案。
✅ 总结
对新手而言,用 json 模块配合 .json 文件实现 Flet 应用的数据持久化,是成本最低、理解最直观、落地最可靠的方案。它绕开了复杂的数据库配置和用户认证体系,却足以支撑绝大多数个人工具类应用的核心需求。记住三个关键动作:读(启动时)→ 改(交互中)→ 写(变更后),你的待办清单从此真正“记得住”。
立即学习“Python免费学习笔记(深入)”;


















