当前位置: 首页 > 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.xdnf.cn/news/1236223.html

相关文章:

  • RAG-Semantic Chunking
  • 一加Ace5无法连接ColorOS助手解决(安卓设备ADB模式无法连接)
  • 迈向透明人工智能: 可解释性大语言模型研究综述
  • JavaScript 性能优化实战指南:从运行时到用户体验的全面提升​
  • LangGraph认知篇-Persistence 持久化
  • 嵌入式学习日志——数据结构(一)
  • Supergateway教程
  • 使用DrissionPage实现xhs笔记自动翻页并爬取笔记视频、图片
  • Day22--回溯--77. 组合,216. 组合总和 III,17. 电话号码的字母组合
  • Kafka 是什么?
  • 《汇编语言:基于X86处理器》第11章 MS-Windows编程(3)
  • 【stm32】按键控制LED以及光敏传感器控制蜂鸣器
  • OSPF知识点整理
  • 实战《从0开始使用SwiftUI搭建记账软件》- 2、SwiftUI 知识点详解与使用场景
  • 6.1、Redis多级缓存原理和优化、Redis部分参数优化调整
  • 【超分辨率专题】PiSA-SR:单步Diff超分新突破,即快又好,还能在线调参
  • Linux 摄像头实时抓取:V4L2、FFmpeg 与 GStreamer 全面讲解
  • python工具方法51 视频数据的扩充(翻转、resize、crop、re_fps)
  • Transformer模型用于MT信号相关性预测与分析
  • 《深入浅出RabbitMQ:从零基础到面试通关》
  • 渗透作业4
  • wordpress登陆前登陆后显示不同的顶部菜单
  • 数据结构代码
  • 08.Redis 持久化
  • AOP动态代理
  • #C语言——刷题攻略:牛客编程入门训练(四):运算
  • 大屏项目展示
  • 面向智能体的上下文工程:策略、实现与 LangGraph 实践
  • 09.Redis 常用命令
  • STM32-ESP8266通过MQTT与阿里云通讯