技术选型决策树

小型应用
中大型应用
严格状态追溯
响应式编程
简单局部状态
新手
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.pswp.cn/pingmian/91933.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91933.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91933.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis类型之String

1.Redis中的string注意本文以及之后讲的redis的类型但是指的value的类型&#xff0c;所有的key都是stringRedis中的字符串&#xff0c;直接就是按照二进制数据的方式存储的&#xff0c;不会做任何的编码转换&#xff0c;这里相对于mysql就比较好&#xff08;个人感觉&#xff0…

[激光原理与应用-156]:光学器件 - 激光器为什么会出现多余的能量,哪些地方会出现多余能量?

在激光器运行过程中&#xff0c;多余能量的出现是不可避免的物理现象&#xff0c;其根源在于能量转换与传输过程中的非理想特性。以下从能量来源、产生位置及具体机制三方面进行详细说明&#xff1a;一、多余能量的主要来源泵浦源效率限制泵浦源&#xff08;如激光二极管、闪光…

Arxiv-Daily

Daily Paper Report - 2025-07-24 12:53 Today’s Recommended Papers 1. Multi-modal Multi-task Pre-training for Improved Point Cloud Understanding Authors: Liwen Liu, Weidong Yang, Lipeng Ma, Ben Fei Deep-Dive Summary: 多模态多任务预训练以改善点云理解 预…

如何对云环境或者超融合系统进行性能测试?

最近几个月&#xff0c;公司开启了新的产品计划&#xff0c;准备来做一个国产超融合一体机&#xff08;其实个人觉得现在入行已经晚了太多了&#xff0c;市场基本没有多少了&#xff09; POC功能测试过完&#xff0c;但是感觉不到什么优势&#xff0c;由于芯片架构采用的是arm架…

【web自动化测试】实战

web自动化测试就是对界面的测试1、编写测试用例2、参考测试用例&#xff0c;创建自动化测试项目&#xff0c;编写自动化测试脚本论坛登录页&#xff1a;ForumLoginTest.py论坛首页&#xff1a;ForumListTest.py论坛详情页&#xff1a;ForumDetailTest.py论坛编辑页&#xff1a;…

在Maxscript中随机化对象变换、颜色和材质

只需几行Maxscript,即可为3ds Max场景带来更多活力和变化! 在本文中,您将学习如何快速随机化选定对象的位置、旋转、线颜色和材质。 非常适合在ArchViz、动态图形和产品可视化项目中创建更自然、更少机械的布局。 为什么要使用随机化脚本? 1.快速为场景添加自然随机性 2.…

分类数据集 - 交通事故场景分类数据集下载

数据集介绍&#xff1a;交通事故场景分类数据集&#xff0c;真实交通场景高质量图片数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控场景下是否发生交通事故检测项目&#xff0c;以及作为监控场景通用交通检测数据集场景数据的补充&#xff1b;数据集类别&#xff1…

内网公网详解,及无公网IP内网穿透给外网直接远程连接访问的具体实现方法步骤

一、什么是内网、外网1、内网IP&#xff08;局域网IP&#xff09;是指在私有网络或局域网内部使用的IP地址&#xff0c;无法直接从互联网访问&#xff0c;需通过NAT&#xff08;网络地址转换&#xff09;技术实现对外通信。内网IP&#xff08;Intranet IP&#xff09;是专为局域…

Redis协议数据迁移方式

主从复制&#xff08;REPLICAOF/SLAVEOF&#xff09;&#xff1a;目标实例挂为从节点&#xff0c;通过复制协议全量增量同步后切换为主。模拟从节点工具&#xff1a;模拟复制协议同步数据&#xff0c;常见两种实现&#xff1a;(1) 拉取全量和增量命令流&#xff0c;在本地生成 …

英语中日期与时间缩写

日常使用中&#xff0c;时间缩写无处不在。掌握这些缩写不仅能提高沟通效率&#xff0c;还能让您的英语表达更加地道和专业。本文将系统性地介绍英语中各类时间相关缩写&#xff0c;包括月份、星期、时刻表达等&#xff0c;并提供实用记忆技巧和应用场景。 一、时间缩写基础概…

【Spring Cloud】-- RestTeplate实现远程调用

实现远程调用有很多种方式&#xff0c;这里我们使用RestTemplate来进行实现。 REST &#xff1a;表现层资源状态转移&#xff08;资源在网络中以某种表现形式进行状态转移&#xff09;&#xff0c;是一种软件架构风格&#xff0c;状态转移&#xff1a;数据状态的变化。 表现层&…

2025年信创政策解读:如何应对国产化替代挑战?(附禅道/飞书多维表格/华为云DevCloud实战指南)

本文核心产品&#xff1a;​​禅道&#xff08;国产项目管理工具&#xff09;、飞书多维表格&#xff08;协同办公工具&#xff09;、华为云DevCloud&#xff08;云端研发平台&#xff09;​​ ——在“自主可控”成为国家战略关键词的2025年&#xff0c;国产化替代已从“可选动…

如何让 RAG 检索更高效?——大模型召回策略全解

如何让 RAG 检索更高效&#xff1f;——大模型召回策略全解 一、引子&#xff1a;RAG 的“强”靠得住吗&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff09;作为一种将文档检索与大语言模型结合的框架&#xff0c;已成为企业落地知识问答、搜索增强、智能…

Bilateral Reference for High-Resolution Dichotomous Image Segmentation

代码来源 https://github.com/ZhengPeng7/BiRefNet 模块作用 DIS 是一种旨在对高分辨率图像中的目标物体进行精确分割的技术&#xff0c;尤其适用于具有复杂细微结构的物体&#xff0c;例如细长的边缘或微小细节。传统方法在处理这类任务时往往难以捕捉细微特征或恢复高分辨…

RAGFlow 0.20.0 : Multi-Agent Deep Research

Deep Research&#xff1a;Agent 时代的核心能力2025 年被称为 Agent 落地元年&#xff0c;在解锁的各类场景中&#xff0c;最有代表性之一&#xff0c;就是 Deep Research 或者以它为基座的各类应用。为什么这么讲&#xff1f; 因为通过 Agentic RAG 及其配套的反思机制&#…

CMakeLists.txt学习

一&#xff1a;#是行注释 &#xff0c;[[ 块注释 ]]0.cmake_minimum_required: 指定使用的cmake的最低版本1.project() 定义工程名称并可以指定工程的版本&#xff0c;工程描述&#xff0c;web主页地址&#xff0c;支持的语言&#xff08;默认情况支持所有语言&#xff09;2.…

Pytorch-04 搭建神经网络架构工作流

搭建神经网络架构 在pytorch中&#xff0c;神经网络被抽象成由一系列对数据执行特定操作的层或者模块组成&#xff0c;比如下面的Attention实现&#xff0c;每个块都是一个模块或者层。 如果你想快速搭建网络架构&#xff0c;torch.nn这个命名空间提供了所有很多开箱即用的层…

从“碎片化”到“完美重组”:IP报文的分片艺术

前言 在网络通信中&#xff0c;当IP层需要传输的数据包大小超过数据链路层的MTU限制时&#xff0c;就必须进行分片处理。本文将完整解析IP分片的工作机制&#xff0c;包括分片字段的作用、如何减少分片&#xff0c;以及分片报文的组装原理。 IP报头解析请参考&#xff…

[GESP202306 四级] 2023年6月GESP C++四级上机题超详细题解,附带讲解视频!

本文为2023年6月GESP C四级的上机题目的详细题解&#xff01;觉得写的不错或者有帮助可以点个赞啦! &#xff08;第一次讲解视频&#xff0c;有问题可以指出&#xff0c;不足之处也可以指出&#xff09; 目录 题目一讲解视频: 题目二讲解视频: 题目一: 幸运数 题目大意: …

内网穿透 FRP 配置指南

关键词&#xff1a;内网穿透、FRP配置、frps、frpc、远程访问、自建服务器、反向代理、TCP转发、HTTP转发 在开发或部署项目时&#xff0c;我们经常遇到内网设备无法被公网访问的问题&#xff0c;例如你想从外网访问你家里的 NAS、远程调试开发板&#xff0c;或是访问本地测试环…