Python+Flutter前后端分离开发跨平台待办事项APP实战

ops/2025/2/25 16:05:46/

以下是一个简单的示例,展示如何使用 Flutter 开发一个待办事项应用,并通过 FastAPI 和 SQLAlchemy 作为后端接口。为了简化代码,所有的 Flutter 前端代码将写在一个 main.dart 文件中。

1. 后端部分(FastAPI + SQLAlchemy)

首先,我们需要创建一个简单的 FastAPI 后端服务,用于处理待办事项的增删改查操作。

安装依赖

在你的 Python 环境中安装以下依赖:

pip install fastapi uvicorn sqlalchemy

创建 FastAPI 应用

创建一个文件 main.py,并写入以下代码:

python">from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from sqlalchemy import create_engine, Column, Integer, String, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker# 数据库配置
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()# 待办事项模型
class TodoItem(Base):__tablename__ = "todo_items"id = Column(Integer, primary_key=True, index=True)title = Column(String, index=True)completed = Column(Boolean, default=False)# 创建数据库表
Base.metadata.create_all(bind=engine)# Pydantic 模型
class TodoItemCreate(BaseModel):title: strclass TodoItemUpdate(BaseModel):title: str = Nonecompleted: bool = None# FastAPI 应用
app = FastAPI()# 获取数据库会话
def get_db():db = SessionLocal()try:yield dbfinally:db.close()# 获取所有待办事项
@app.get("/todos/")
def read_todos():db = SessionLocal()items = db.query(TodoItem).all()return [{"id": item.id, "title": item.title, "completed": item.completed} for item in items]# 创建待办事项
@app.post("/todos/")
def create_todo(item: TodoItemCreate):db = SessionLocal()new_item = TodoItem(title=item.title, completed=False)db.add(new_item)db.commit()db.refresh(new_item)return {"id": new_item.id, "title": new_item.title, "completed": new_item.completed}# 更新待办事项
@app.put("/todos/{todo_id}")
def update_todo(todo_id: int, item: TodoItemUpdate):db = SessionLocal()db_item = db.query(TodoItem).filter(TodoItem.id == todo_id).first()if not db_item:raise HTTPException(status_code=404, detail="Item not found")if item.title is not None:db_item.title = item.titleif item.completed is not None:db_item.completed = item.completeddb.commit()db.refresh(db_item)return {"id": db_item.id, "title": db_item.title, "completed": db_item.completed}# 删除待办事项
@app.delete("/todos/{todo_id}")
def delete_todo(todo_id: int):db = SessionLocal()db_item = db.query(TodoItem).filter(TodoItem.id == todo_id).first()if not db_item:raise HTTPException(status_code=404, detail="Item not found")db.delete(db_item)db.commit()return {"message": "Item deleted"}

启动 FastAPI 服务

运行以下命令启动服务:

uvicorn main:app --reload

服务默认运行在 http://127.0.0.1:8000,你可以通过访问 /docs 查看 API 文档。

2. Flutter 前端部分(main.dart)

接下来,我们编写 Flutter 应用来与后端交互。所有代码将写在一个 main.dart 文件中。

安装依赖

在 Flutter 项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:flutter:sdk: flutterhttp: ^0.13.5provider: ^6.0.5

运行 flutter pub get 安装依赖。

编写 Flutter 代码

以下是完整的 main.dart 文件代码:

import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(title: 'Todo App',theme: ThemeData(primarySwatch: Colors.blue,),home: TodoListScreen(),);}
}class TodoListScreen extends StatefulWidget {_TodoListScreenState createState() => _TodoListScreenState();
}class _TodoListScreenState extends State<TodoListScreen> {List<dynamic> _todos = [];final TextEditingController _textEditingController = TextEditingController();void initState() {super.initState();_fetchTodos();}Future<void> _fetchTodos() async {try {final response = await http.get(Uri.parse('http://127.0.0.1:8000/todos/'));if (response.statusCode == 200) {setState(() {_todos = json.decode(response.body);});} else {throw Exception('Failed to load todos');}} catch (e) {print('Error fetching todos: $e');}}Future<void> _createTodo(String title) async {try {final response = await http.post(Uri.parse('http://127.0.0.1:8000/todos/'),headers: {'Content-Type': 'application/json'},body: json.encode({'title': title}),);if (response.statusCode == 200) {_fetchTodos();} else {throw Exception('Failed to create todo');}} catch (e) {print('Error creating todo: $e');}}Future<void> _updateTodo(int id, {String? title, bool? completed}) async {try {final response = await http.put(Uri.parse('http://127.0.0.1:8000/todos/$id'),headers: {'Content-Type': 'application/json'},body: json.encode({'title': title,'completed': completed,}),);if (response.statusCode == 200) {_fetchTodos();} else {throw Exception('Failed to update todo');}} catch (e) {print('Error updating todo: $e');}}Future<void> _deleteTodo(int id) async {try {final response = await http.delete(Uri.parse('http://127.0.0.1:8000/todos/$id'));if (response.statusCode == 200) {_fetchTodos();} else {throw Exception('Failed to delete todo');}} catch (e) {print('Error deleting todo: $e');}}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Todo List'),),body: Column(children: [Expanded(child: ListView.builder(itemCount: _todos.length,itemBuilder: (context, index) {final todo = _todos[index];return ListTile(title: Text(todo['title']),trailing: Checkbox(value: todo['completed'],onChanged: (bool? value) {_updateTodo(todo['id'], completed: value);},),onLongPress: () {_deleteTodo(todo['id']);},);},),),Padding(padding: const EdgeInsets.all(8.0),child: Row(children: [Expanded(child: TextField(controller: _textEditingController,decoration: InputDecoration(hintText: 'Enter a new todo',),),),IconButton(icon: Icon(Icons.add),onPressed: () {final title = _textEditingController.text;if (title.isNotEmpty) {_createTodo(title);_textEditingController.clear();}},),],),),],),);}
}

3. 运行和测试

启动 FastAPI 后端服务:

uvicorn main:app --reload

运行 Flutter 应用:
在 Flutter 项目目录下运行:

flutter run

测试功能:

  • 在 Flutter 应用中添加待办事项,查看是否成功保存到后端。
  • 勾选或取消勾选待办事项,查看是否更新状态。
  • 长按待办事项删除,查看是否从后端删除。

http://www.ppmy.cn/ops/161236.html

相关文章

如何实现使用DeepSeek的CV模型对管道内模糊、低光照或水渍干扰的图像进行去噪、超分辨率重建。...

要使用 DeepSeek 的 CV 模型对管道内模糊、低光照或水渍干扰的图像进行去噪、超分辨率重建&#xff0c;一般可以按照以下步骤实现&#xff1a; 1. 准备工作 1.1 获取 API 访问权限 首先&#xff0c;你需要从 DeepSeek 官方获取 API 访问权限和相应的 API 密钥。这通常需要在 De…

es-head(es库-谷歌浏览器插件)

1.下载es-head插件压缩包&#xff0c;并解压缩 2.谷歌浏览器添加插件 3.使用

离子阱量子计算机的原理与应用:开辟量子计算的新天地

离子阱量子计算机的原理与应用:开辟量子计算的新天地 大家好,我是Echo_Wish,今天我们来聊聊一个正在颠覆传统计算机架构的前沿话题——离子阱量子计算机。随着量子计算的研究不断取得进展,它的潜力正在吸引越来越多的关注。而在众多量子计算技术中,离子阱量子计算因其优异…

基于SpringBoot的校园消费点评管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

leetcode 207. 课程表

题目如下 数据范围 做题之前先搞清楚一个概念:拓扑序列 即在一个简单图内找一个入度为0的节点&#xff0c; 删除这个节点并删去与之相连接的边并把这条边连接的节点入度减一(如果存在)。 如此循环往复直到图内不存在节点我们认为拓扑序列存在。 那么在本题中参与课程的要求…

【Deepseek+Dify】wsl2+docker+Deepseek+Dify部署本地大模型知识库问题总结

wsl2dockerDeepseekDify部署本地大模型知识库问题总结 基于ollama部署本地文本模型和嵌入模型 部署教程 DeepSeekdify 本地知识库&#xff1a;真的太香了 问题贴&#xff1a;启动wsl中docker中的dify相关的容器 发现postgre服务和daemon服务一直在重启&#xff0c;导致前端加…

云计算该如何实现高效数据存储和处理?

云计算可以为企业提供一个强大的平台&#xff0c;帮助企业实现高效的数据存储和处理&#xff0c;云计算有着高度的灵活性和可扩展性&#xff0c;为用户与企业提供高效的资源管理和实时数据处理能力&#xff0c;一下就是云计算该如何实现高效数据存储和处理的几个方面&#xff1…

Linux基础开发工具的使用(apt、vim、gcc、g++、gdb、make、makefile)

Linux软件包管理器–apt Linux安装软件的方式 在Linux下安装软件的方法有以下三种&#xff1a; 下载到程序的源代码&#xff0c;自己编译出可执行程序获取deb安装包、然后使用dpkg命令安装。&#xff08;不解决依赖关系&#xff09;通过apt进行安装软件。 小知识点&#xf…