当前位置: 首页 > news >正文

Flutter各大主流状态管理框架技术选型分析及具体使用步骤


技术选型决策树

小型应用
中大型应用
严格状态追溯
响应式编程
简单局部状态
新手
React背景
Vue背景
高频更新
低内存占用
项目需求
GetX
Riverpod
Bloc
MobX
ValueNotifier
团队经验
性能要求
Redux

示例对比表

框架学习曲线样板代码类型安全测试友好适用规模
Provider小-中
Riverpod所有规模
Bloc中-大
GetX极少
MobX中-大
ValueNotifier极少局部状态

1. Provider(官方基础方案)

使用步骤:
创建ChangeNotifier模型
用Provider包裹应用
在UI中使用context.watch

详细步骤

  1. 添加依赖
dependencies:flutter:sdk: flutterprovider: ^6.0.5
  1. 创建状态模型
class CounterModel with ChangeNotifier {int _count = 0;int get count => _count;void increment() {_count++;notifyListeners(); // 通知监听器}
}
  1. 在顶层包裹Provider
void main() {runApp(ChangeNotifierProvider(create: (context) => CounterModel(),child: MyApp(),),);
}
  1. 在UI中使用状态
class CounterScreen extends StatelessWidget {Widget build(BuildContext context) {final counter = context.watch<CounterModel>();return Scaffold(body: Text('Count: ${counter.count}'),floatingActionButton: FloatingActionButton(onPressed: () => counter.increment(),child: Icon(Icons.add),),);}
}

2. Riverpod(现代推荐方案)

使用步骤:
定义Provider
用ProviderScope包裹
使用WidgetRef访问

详细步骤

  1. 添加依赖
dependencies:flutter_riverpod: ^2.4.9riverpod_annotation: ^2.3.0
dev_dependencies:build_runner: ^2.4.8riverpod_generator: ^2.3.3
  1. 创建Provider
// counter_provider.dart
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'counter_provider.g.dart';
class Counter extends _$Counter {int build() => 0; // 初始状态void increment() => state++;
}
  1. 生成代码
flutter pub run build_runner watch
  1. 设置ProviderScope
void main() {runApp(ProviderScope(child: MyApp(),),);
}
  1. 在UI中使用
class CounterScreen extends ConsumerWidget {Widget build(BuildContext context, WidgetRef ref) {final count = ref.watch(counterProvider);return Scaffold(body: Text('Count: $count'),floatingActionButton: FloatingActionButton(onPressed: () => ref.read(counterProvider.notifier).increment(),child: Icon(Icons.add),);}
}

3. Bloc(企业级方案)

使用步骤:
定义Event
定义State
创建Bloc处理逻辑
用BlocBuilder连接

详细步骤

  1. 添加依赖
dependencies:flutter_bloc: ^8.1.3bloc: ^8.1.0
  1. 定义事件和状态
// 事件
abstract class CounterEvent {}
class Increment extends CounterEvent {}// 状态
class CounterState {final int count;CounterState(this.count);
}
  1. 创建Bloc
class CounterBloc extends Bloc<CounterEvent, CounterState> {CounterBloc() : super(CounterState(0)) {on<Increment>((event, emit) {emit(CounterState(state.count + 1));});}
}
  1. 在顶层提供Bloc
void main() {runApp(BlocProvider(create: (context) => CounterBloc(),child: MyApp(),),);
}
  1. UI中使用
class CounterScreen extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: BlocBuilder<CounterBloc, CounterState>(builder: (context, state) {return Text('Count: ${state.count}');},),floatingActionButton: FloatingActionButton(onPressed: () => context.read<CounterBloc>().add(Increment()),child: Icon(Icons.add),),);}
}

4. GetX(全栈式方案)

使用步骤:
创建Controller
用Obx包裹UI
更新响应式变量

详细步骤

  1. 添加依赖
dependencies:get: ^4.6.5
  1. 创建控制器
class CounterController extends GetxController {var count = 0.obs; // 响应式变量void increment() => count++;
}
  1. 配置GetMaterialApp
void main() {runApp(GetMaterialApp( // 替换MaterialApphome: CounterScreen(),),);
}
  1. UI中使用
class CounterScreen extends StatelessWidget {final CounterController c = Get.put(CounterController());Widget build(BuildContext context) {return Scaffold(body: Obx(() => Text('Count: ${c.count}')),floatingActionButton: FloatingActionButton(onPressed: () => c.increment(),child: Icon(Icons.add),),);}
}
  1. 路由导航(无需context)
// 任何地方调用
Get.to(NextScreen());
Get.back();

5. Redux(单向数据流方案)

使用步骤:
定义State
定义Actions
创建Reducer
创建Store
用StoreProvider包裹

详细步骤

  1. 添加依赖
dependencies:flutter_redux: ^0.11.0redux: ^5.0.0
  1. 定义状态和操作
// 状态
class AppState {final int counter;AppState(this.counter);
}// 操作
class IncrementAction {}
  1. 创建Reducer
AppState reducer(AppState state, dynamic action) {if (action is IncrementAction) {return AppState(state.counter + 1);}return state;
}
  1. 创建Store
void main() {final store = Store<AppState>(reducer,initialState: AppState(0),);runApp(StoreProvider(store: store,child: MyApp(),),);
}
  1. UI中使用
class CounterScreen extends StatelessWidget {Widget build(BuildContext context) {return StoreConnector<AppState, int>(converter: (store) => store.state.counter,builder: (context, count) {return Scaffold(body: Text('Count: $count'),floatingActionButton: FloatingActionButton(onPressed: () => StoreProvider.of<AppState>(context).dispatch(IncrementAction()),child: Icon(Icons.add),),);},);}
}

6. MobX(响应式方案)

使用步骤:
graph TDC[创建Store] --> O[用Observer包裹UI]O --> R[更新@observable变量]

详细步骤

  1. 添加依赖
dependencies:flutter_mobx: ^2.0.6mobx: ^2.1.3build_runner: ^2.4.8
dev_dependencies:mobx_codegen: ^2.0.7
  1. 创建Store
import 'package:mobx/mobx.dart';part 'counter_store.g.dart';class CounterStore = _CounterStore with _$CounterStore;abstract class _CounterStore with Store {int count = 0;void increment() {count++;}
}
  1. 生成代码
flutter pub run build_runner build
  1. 在顶层提供Store
void main() {final counterStore = CounterStore();runApp(Provider(create: (context) => counterStore,child: MyApp(),),);
}
  1. UI中使用
class CounterScreen extends StatelessWidget {Widget build(BuildContext context) {final counterStore = Provider.of<CounterStore>(context);return Scaffold(body: Observer(builder: (_) => Text('Count: ${counterStore.count}'),),floatingActionButton: FloatingActionButton(onPressed: () => counterStore.increment(),child: Icon(Icons.add),),);}
}

7. ValueNotifier(轻量级方案)

使用步骤:
创建ValueNotifier
用ValueListenableBuilder包裹
更新value属性

详细步骤

  1. 创建ValueNotifier
final counterNotifier = ValueNotifier<int>(0);
  1. UI中使用
class CounterScreen extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: ValueListenableBuilder<int>(valueListenable: counterNotifier,builder: (context, value, _) {return Text('Count: $value');},),floatingActionButton: FloatingActionButton(onPressed: () => counterNotifier.value++,child: Icon(Icons.add),),);}
}
  1. 清理资源(在StatefulWidget中)

void dispose() {counterNotifier.dispose();super.dispose();
}

金句建议
“状态管理是Flutter开发的灵魂抉择,Riverpod和Bloc代表着工程化的未来,
而GetX则是快速验证创意的利器——明智的选择比盲目的努力更重要”

http://www.dtcms.com/a/312542.html

相关文章:

  • 网络原理 - TCP/IP
  • 计算机网络(TCP篇)
  • PPT自动化 python-pptx - 10 : 表格(tables)
  • 力扣经典算法篇-42-矩阵置零(辅助数组标记法,使用两个标记变量)
  • 使命召唤21:黑色行动6 免安 离线 中文版
  • 1.8 axios详解
  • Axios介绍
  • 一键安装RabbitMQ脚本
  • ESP32学习-I2C(IIC)通信详解与实践
  • 线程锁-互斥、自旋、读写、原子操作、线程池
  • [硬件电路-147]:模拟电路 - DC/DC电压的三种架构:升压(Boost)、降压(Buck)或升降压(Buck-Boost)
  • GLM-4.5 解读:统一推理、编码与智能体的全能王
  • 利用AI渲染技术提升元宇宙用户体验的技术难点有哪些?
  • 微分方程模型:用“变化率”的语言,描绘世间万物的动态演化
  • 文本换行问题
  • [每周一更]-(第153期):**PDF终极防护指南:命令行全栈加密+一键权限锁死实战(附脚本模板)**
  • 前端JS-调用单删接口来删除多个选中文件
  • 前端 拼多多4399笔试题目
  • Spring 03 Web springMVC
  • 如何查看SoC线程的栈起始地址及大小
  • leecode2962 统计最大元素出现至少K次的子数组
  • 第12届蓝桥杯Scratch图形化【省赛】初级组 2021年4月24日
  • 从Docker衔接到导入黑马商城以及前端登录显示用户或密码错误的相关总结(个人理解,仅供参考)
  • 从传热学基础到有限元弱形式推导:拆解热传导问题Matlab有限元离散核心
  • C++ 信号处理
  • 【AI编程工具IDE/CLI/插件专栏】-国外IDE与Cursor能力对比
  • 【从零开始速通C语言1】 - 汇编语言1
  • 西门子PLC基础指令4:输出指令、立即输出指令
  • 信用衍生工具
  • 《基于特征融合的小目标检测方法及其在医学影像领域的应用研究》论文解析