具备Flutter基础的开发者进阶项目推荐请求(含Riverpod/Bloc等)
进阶Flutter练习项目推荐
1. GitHub仓库浏览应用
适合从基础API交互过渡到复杂状态管理,覆盖所有目标技术点
- 核心功能:
- 搜索GitHub用户,展示用户基本信息
- 查看用户的公开仓库列表,支持按星数排序
- 仓库详情页展示README、语言占比等信息
- 收藏/取消收藏仓库,本地存储收藏列表
- 技术点落地:
- HTTP网络请求:用
http或dio封装统一的API服务类,处理请求头、错误拦截(比如404用户不存在、网络超时),并将JSON响应解析为实体类 - 状态管理:
- 选Riverpod:用
StateNotifierProvider管理搜索状态(加载/成功/失败)、仓库列表状态;用Provider提供API服务实例 - 选Bloc:拆分
SearchBloc处理用户搜索逻辑,RepoBloc处理仓库列表和收藏操作,通过Event触发状态变更
- 选Riverpod:用
- 依赖注入:用
get_it注册API服务、本地存储服务、数据仓库(Repository),实现业务逻辑与数据层解耦;或者直接用Riverpod的Provider注入依赖,无需额外包 - RxDart:用
BehaviorSubject处理搜索输入流,添加debounceTime(500ms)实现输入防抖,避免频繁发起API请求;用map、filter操作符过滤无效搜索关键词(比如空字符串)
- HTTP网络请求:用
2. 多城市天气预报应用
侧重异步状态处理和数据流整合,适合练习RxDart的操作符
- 核心功能:
- 自动定位获取当前城市实时天气
- 手动搜索全球城市,查看未来7天预报
- 天气卡片支持下拉刷新,展示温度、湿度、风力等数据
- 收藏常用城市,快速切换查看
- 技术点落地:
- HTTP网络请求:调用公开天气API,封装请求参数(比如城市ID、API密钥),处理响应的不同状态(比如请求成功、权限不足、城市未找到)
- 状态管理:
- 选Riverpod:用
AsyncNotifier处理异步定位和天气请求,自动管理加载/成功/失败状态;用FamilyProvider根据城市ID获取对应天气数据 - 选Bloc:用
WeatherCubit管理天气数据状态,LocationCubit处理定位逻辑,通过State传递不同状态信息
- 选Riverpod:用
- 依赖注入:注册天气API服务、定位服务、本地存储服务,通过依赖注入替换不同环境的实现(比如开发环境用模拟数据,生产用真实API)
- RxDart:用
Observable监听定位服务的位置更新流,结合distinctUntilChanged避免重复请求;用combineLatest合并实时天气和7天预报数据,统一更新UI
3. 分类Todo管理应用(进阶版)
通过复杂业务逻辑强化状态管理和依赖注入的实践
- 核心功能:
- 增删改查Todo,支持设置优先级(高/中/低)和分类(工作/生活/学习)
- 按分类、优先级筛选Todo,支持批量操作(批量完成/删除)
- 本地存储Todo数据,支持云端同步(可模拟API或搭建简单后端)
- 统计不同分类的Todo完成率,实时展示
- 技术点落地:
- HTTP网络请求:实现Todo的云端同步接口(POST新增、GET列表、PUT更新、DELETE删除),处理离线缓存和同步冲突(比如本地修改与云端数据不一致)
- 状态管理:
- 选Riverpod:用
StateNotifierProvider管理全局Todo列表状态,用Provider.family根据筛选条件返回过滤后的Todo列表 - 选Bloc:拆分
TodoBloc处理Todo的增删改查事件,FilterBloc处理筛选逻辑,通过Event触发状态变更
- 选Riverpod:用
- 依赖注入:注册本地存储服务(比如
hive)、云端API服务、Todo数据仓库,实现业务逻辑与数据存储层的解耦,方便单元测试 - RxDart:用
PublishSubject监听Todo的变更事件,触发本地存储和云端同步;用scan操作符统计不同分类的Todo完成数量,实时更新底部统计栏
额外实践建议
- 先选定一种状态管理框架(比如先练Riverpod,再用Bloc重写同一项目),对比两种方案的差异
- RxDart从简单操作符(
debounceTime、map)入手,逐步尝试复杂操作符(combineLatest、scan) - 依赖注入遵循单一职责原则,避免过度注入,优先用框架自带的注入能力(比如Riverpod)减少第三方包依赖
内容的提问来源于stack exchange,提问作者holparb
相关产品推荐
相关产品推荐

