# Flutter_state_management_demo **Repository Path**: vper/flutter_state_management_demo ## Basic Information - **Project Name**: Flutter_state_management_demo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-06 - **Last Updated**: 2025-12-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Flutter 状态管理方案对比:GetX vs Riverpod vs BLoC > 🚀 配合文章《GetX 要凉?为什么 2025 Flutter 大厂项目都在用 Riverpod 或 BLoC?(附完整迁移指南)》的示例项目 ## 项目简介 本项目是一个Flutter状态管理方案对比演示项目,实现了三种主流状态管理方案的相同功能:GetX、Riverpod和BLoC。通过直观的代码对比,帮助开发者理解不同状态管理方案的优缺点和适用场景。 ## 🎯 项目目标 - 直观对比GetX、Riverpod和BLoC三种状态管理方案的实现方式 - 展示不同方案在代码简洁性、可维护性和团队协作方面的差异 - 提供从GetX迁移到Riverpod/BLoC的参考示例 ## 📱 功能演示 本项目实现了一个简单的计数器功能,使用三种不同的状态管理方案: - **GetX Demo**: 使用GetX的状态管理和依赖注入 - **Riverpod Demo**: 使用Riverpod的Notifier模式 - **BLoC Demo**: 使用BLoC的Cubit模式 ## 🏗️ 项目结构 ``` lib/ ├── main.dart # 应用入口,配置不同状态管理方案 ├── pages/ │ ├── home_page.dart # 主页面,导航到不同状态管理示例 │ └── subpages/ │ ├── getx_page.dart # GetX实现页面 │ ├── riverpod_page.dart # Riverpod实现页面 │ └── bloc_page.dart # BLoC实现页面 └── state/ ├── getx/ │ └── getx_controller.dart # GetX控制器 ├── riverpod/ │ └── counter_provider.dart # Riverpod提供者 └── bloc/ └── counter_cubit.dart # BLoC Cubit ``` ## 🔧 状态管理方案对比 ### GetX **优点:** - 代码简洁,学习曲线低 - 内置依赖注入、状态管理和路由 - 适合快速开发和小型项目 **缺点:** - 自由度太高,容易导致"屎山项目" - 生命周期管理困难,容易出现内存泄漏 - 不适合大型团队和长期维护项目 **实现示例:** ```dart class GetXCounter extends GetxController { final RxInt count = 0.obs; void increment() => count.value++; } // UI中使用 final controller = Get.put(GetXCounter()); Obx(() => Text('Count: ${controller.count.value}')) ``` ### Riverpod (推荐) **优点:** - 无上下文依赖,可以在任何地方使用 - 编译时检查,减少运行时错误 - 函数式Provider,依赖关系清晰 - 自动处理生命周期和内存管理 - 适合MVVM/Clean架构 **缺点:** - 学习曲线相对较陡 - 代码量比GetX稍多 **实现示例:** ```dart class CounterNotifier extends Notifier { @override int build() => 0; void increment() => state++; } final counterProvider = NotifierProvider(CounterNotifier.new); // UI中使用 final count = ref.watch(counterProvider); Text('Count: $count') ``` ### BLoC **优点:** - 规范性最强,状态流转最可控 - 适合大型团队协作 - 架构稳定,易于测试 **缺点:** - 代码量最多,写起来相对啰嗦 - 学习曲线最陡峭 **实现示例:** ```dart class CounterCubit extends Cubit { CounterCubit() : super(0); void increment() => emit(state + 1); } // UI中使用 BlocBuilder( builder: (_, count) => Text('Count: $count'), ) ``` ## 🚀 运行项目 ### 前置要求 - Flutter SDK (>=3.10.1) - Dart SDK - 代码编辑器 (推荐VS Code或Android Studio) ### 安装依赖 ```bash flutter pub get ``` ### 运行项目 ```bash # Web版本 flutter run -d web-server --web-port 8080 # 或者构建后运行 flutter build web cd build/web python -m http.server 8080 ``` 然后在浏览器中访问 `http://localhost:8080` ## 📊 2025年大厂选型建议 根据2025年Flutter招聘和项目实际情况: 1. **Riverpod** - 大厂首选推荐 - 适合中大型项目和团队协作 - 架构清晰,易于维护和测试 - Google官方趋势明显偏向Riverpod 2. **BLoC** - 团队协作最稳定 - 适合追求工程化和规范流程的大型团队 - 状态流转最可控,架构最稳定 3. **GetX** - 适合小型项目和快速原型 - 代码简洁,开发效率高 - 但不适合大型长期项目 ## 🔄 迁移指南 ### 从GetX迁移到Riverpod 1. **替换控制器**: ```dart // GetX class GetXCounter extends GetxController { final RxInt count = 0.obs; void increment() => count.value++; } // Riverpod class CounterNotifier extends Notifier { @override int build() => 0; void increment() => state++; } final counterProvider = NotifierProvider(CounterNotifier.new); ``` 2. **替换UI使用方式**: ```dart // GetX final controller = Get.put(GetXCounter()); Obx(() => Text('Count: ${controller.count.value}')) // Riverpod final count = ref.watch(counterProvider); Text('Count: $count') ``` ### 从GetX迁移到BLoC 1. **替换控制器**: ```dart // GetX class GetXCounter extends GetxController { final RxInt count = 0.obs; void increment() => count.value++; } // BLoC class CounterCubit extends Cubit { CounterCubit() : super(0); void increment() => emit(state + 1); } ``` 2. **替换UI使用方式**: ```dart // GetX final controller = Get.put(GetXCounter()); Obx(() => Text('Count: ${controller.count.value}')) // BLoC BlocBuilder( builder: (_, count) => Text('Count: $count'), ) ``` ## 📈 性能对比 | 方案 | 内存占用 | 重建效率 | 学习曲线 | 团队协作 | |------|---------|---------|---------|---------| | GetX | 中等 | 高 | 低 | 低 | | Riverpod | 低 | 高 | 中 | 高 | | BLoC | 低 | 中 | 高 | 高 | ## 🤝 贡献 欢迎提交Issue和Pull Request来改进这个项目! ## 📄 许可证 本项目采用MIT许可证 - 查看 [LICENSE](LICENSE) 文件了解详情 ## 🙏 致谢 感谢Flutter社区和以下开源项目的贡献者: - [GetX](https://github.com/jonataslaw/getx) - [Riverpod](https://github.com/rrousselGit/riverpod) - [Flutter BLoC](https://github.com/felangel/bloc) --- > 💡 **提示**: 这个项目是为了配合文章《GetX 要凉?为什么 2025 Flutter 大厂项目都在用 Riverpod 或 BLoC?(附完整迁移指南)》而创建的示例项目。如果你对这个项目感兴趣,欢迎点赞、收藏和分享!