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

Flutter Provider状态管理完全指南

Flutter Provider状态管理完全指南引言Provider是Flutter生态中最流行的状态管理方案之一它基于InheritedWidget实现提供了简单、高效的状态管理方式。本文将深入探讨Provider的核心概念、使用方法和最佳实践。一、Provider基础1.1 添加依赖dependencies: provider: ^6.0.51.2 创建ChangeNotifierimport package:flutter/foundation.dart; class CounterProvider extends ChangeNotifier { int _count 0; int get count _count; void increment() { _count; notifyListeners(); } void decrement() { _count--; notifyListeners(); } void reset() { _count 0; notifyListeners(); } }1.3 包装应用void main() { runApp( ChangeNotifierProvider( create: (context) CounterProvider(), child: const MyApp(), ), ); }二、Consumer与Selector2.1 使用Consumerclass CounterDisplay extends StatelessWidget { const CounterDisplay({super.key}); override Widget build(BuildContext context) { return ConsumerCounterProvider( builder: (context, provider, child) { return Text(Count: ${provider.count}); }, ); } }2.2 使用Selector优化性能class CounterDisplay extends StatelessWidget { const CounterDisplay({super.key}); override Widget build(BuildContext context) { return SelectorCounterProvider, int( selector: (context, provider) provider.count, builder: (context, count, child) { return Text(Count: $count); }, ); } }三、MultiProvidervoid main() { runApp( MultiProvider( providers: [ ChangeNotifierProvider(create: (_) CounterProvider()), ChangeNotifierProvider(create: (_) ThemeProvider()), Provider(create: (_) ApiService()), ], child: const MyApp(), ), ); }四、Provider.of与Consumer的对比// 使用Provider.of class MyWidget extends StatelessWidget { const MyWidget({super.key}); override Widget build(BuildContext context) { final counter Provider.ofCounterProvider(context); return ElevatedButton( onPressed: counter.increment, child: Text(Increment: ${counter.count}), ); } } // 使用Consumer class MyWidget extends StatelessWidget { const MyWidget({super.key}); override Widget build(BuildContext context) { return ConsumerCounterProvider( builder: (context, counter, child) { return ElevatedButton( onPressed: counter.increment, child: Text(Increment: ${counter.count}), ); }, ); } }五、状态管理模式5.1 单一职责原则class UserProvider extends ChangeNotifier { User? _user; User? get user _user; Futurevoid login(String email, String password) async { _user await api.login(email, password); notifyListeners(); } void logout() { _user null; notifyListeners(); } } class CartProvider extends ChangeNotifier { ListCartItem _items []; ListCartItem get items _items; void addItem(CartItem item) { _items.add(item); notifyListeners(); } void removeItem(int index) { _items.removeAt(index); notifyListeners(); } }5.2 组合Providerclass OrderProvider extends ChangeNotifier { final UserProvider _userProvider; final CartProvider _cartProvider; OrderProvider(this._userProvider, this._cartProvider); Futurevoid createOrder() async { if (_userProvider.user null) { throw Exception(请先登录); } final order Order( userId: _userProvider.user!.id, items: _cartProvider.items, ); await api.createOrder(order); _cartProvider.clear(); } }六、FutureProvider与StreamProvider6.1 FutureProviderclass UserProfile extends StatelessWidget { const UserProfile({super.key}); override Widget build(BuildContext context) { return FutureProviderUser?( create: (context) async await api.fetchUser(), initialData: null, builder: (context, child) { final user context.watchUser?(); if (user null) { return const CircularProgressIndicator(); } return Text(Welcome, ${user.name}); }, ); } }6.2 StreamProviderclass ChatMessages extends StatelessWidget { const ChatMessages({super.key}); override Widget build(BuildContext context) { return StreamProviderListMessage( create: (context) chatService.messagesStream, initialData: const [], builder: (context, child) { final messages context.watchListMessage(); return ListView.builder( itemCount: messages.length, itemBuilder: (context, index) MessageItem(message: messages[index]), ); }, ); } }七、Selectors高级用法7.1 选择多个值class OrderSummary extends StatelessWidget { const OrderSummary({super.key}); override Widget build(BuildContext context) { return Selector2UserProvider, CartProvider, String( selector: (context, userProvider, cartProvider) { final total cartProvider.items.fold(0, (sum, item) sum item.price); return ${userProvider.user?.name ?? Guest} - \$$total; }, builder: (context, summary, child) { return Text(summary); }, ); } }7.2 自定义比较函数class UserAvatar extends StatelessWidget { const UserAvatar({super.key}); override Widget build(BuildContext context) { return SelectorUserProvider, String?( selector: (context, provider) provider.user?.avatarUrl, shouldRebuild: (previous, next) previous ! next, builder: (context, avatarUrl, child) { return CircleAvatar( backgroundImage: avatarUrl ! null ? NetworkImage(avatarUrl) : null, ); }, ); } }八、Provider与Navigator结合8.1 在路由间共享状态class AppRouter { static Routedynamic generateRoute(RouteSettings settings) { switch (settings.name) { case /: return MaterialPageRoute(builder: (_) const HomePage()); case /profile: return MaterialPageRoute(builder: (_) const ProfilePage()); default: return MaterialPageRoute(builder: (_) const NotFoundPage()); } } }8.2 在Dialog中访问Providervoid showLogoutDialog(BuildContext context) { showDialog( context: context, builder: (context) { return AlertDialog( title: const Text(确认退出), content: const Text(确定要退出登录吗), actions: [ TextButton( onPressed: () Navigator.pop(context), child: const Text(取消), ), TextButton( onPressed: () { Provider.ofUserProvider(context, listen: false).logout(); Navigator.pushReplacementNamed(context, /login); }, child: const Text(确认), ), ], ); }, ); }九、最佳实践9.1 状态分层lib/ ├── providers/ │ ├── auth_provider.dart │ ├── cart_provider.dart │ ├── theme_provider.dart │ └── order_provider.dart └── main.dart9.2 使用listen: false优化性能// 只调用方法不监听变化 Provider.ofCounterProvider(context, listen: false).increment(); // 需要监听变化 final count Provider.ofCounterProvider(context).count;9.3 使用context.watch和context.read// 监听变化相当于Provider.ofCounterProvider(context) final count context.watchCounterProvider().count; // 不监听变化相当于Provider.ofCounterProvider(context, listen: false) context.readCounterProvider().increment();十、测试Providervoid main() { group(CounterProvider, () { late CounterProvider provider; setUp(() { provider CounterProvider(); }); test(初始值为0, () { expect(provider.count, 0); }); test(increment增加计数, () { provider.increment(); expect(provider.count, 1); provider.increment(); expect(provider.count, 2); }); test(decrement减少计数, () { provider.increment(); provider.decrement(); expect(provider.count, 0); }); test(reset重置计数, () { provider.increment(); provider.increment(); provider.reset(); expect(provider.count, 0); }); }); }总结Provider是一个简单而强大的状态管理解决方案它的核心优势包括简单易用基于InheritedWidget学习曲线平缓性能优化通过Selector精确控制重建灵活组合支持MultiProvider组合多个状态生态完善与Flutter框架深度集成通过合理使用Provider你可以构建清晰、可维护的状态管理架构提升Flutter应用的开发效率和质量。

相关文章:

Flutter Provider状态管理完全指南

Flutter Provider状态管理完全指南 引言 Provider是Flutter生态中最流行的状态管理方案之一,它基于InheritedWidget实现,提供了简单、高效的状态管理方式。本文将深入探讨Provider的核心概念、使用方法和最佳实践。 一、Provider基础 1.1 添加依赖 depen…...

Mermaid Live Editor:为什么每个开发者都需要这个实时图表编辑神器?

Mermaid Live Editor:为什么每个开发者都需要这个实时图表编辑神器? 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trendin…...

Wand-Enhancer终极指南:3步免费解锁WeMod Pro高级功能完整教程

Wand-Enhancer终极指南:3步免费解锁WeMod Pro高级功能完整教程 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为每月支付WeMod Pro订阅…...

【Claude文档分析高阶战法】:3个被90%用户忽略的PDF/OCR/多语言混合解析技巧

更多请点击: https://intelliparadigm.com 第一章:Claude文档分析高阶战法总览 Claude在处理长文本、结构化文档与跨段落语义推理方面展现出独特优势,但要释放其全部潜力,需超越基础提问,构建系统化的分析范式。本章聚…...

机器学习加速格点QCD计算:流采样、轮廓变形、控制变量与代理观测量的无偏优化

1. 项目概述:当格点模拟遇见机器学习在计算物理,特别是格点量子色动力学(Lattice QCD)这个领域里,我们这些常年和超级计算机打交道的人,最常挂在嘴边的一个词可能就是“算力瓶颈”。一次完整的非微扰计算&a…...

如何用BooruDatasetTagManager将AI图像标注效率提升500%:从零构建高质量训练数据集

如何用BooruDatasetTagManager将AI图像标注效率提升500%:从零构建高质量训练数据集 【免费下载链接】BooruDatasetTagManager 项目地址: https://gitcode.com/gh_mirrors/bo/BooruDatasetTagManager 你是否正在为AI绘画模型准备训练数据,却因手动…...

JetBrains IDE试用期重置终极指南:三步轻松恢复30天试用

JetBrains IDE试用期重置终极指南:三步轻松恢复30天试用 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你是否曾因JetBrains IDE试用期到期而苦恼?ide-eval-resetter正是解决这一痛点的终…...

机器学习增强恒电位分子动力学:原子尺度模拟锂枝晶生长机制

1. 项目概述:当机器学习“遇见”分子动力学,我们如何看清锂枝晶的生长?在锂金属电池的研究中,锂枝晶的生长问题就像一个挥之不去的幽灵,它直接关系到电池的安全性和循环寿命。我们总在说“枝晶刺穿隔膜导致短路”&…...

【紧急预警】2024Q3起医保DRG/DIP结算将强制接入AI行为审计日志!医疗机构AI Agent日志治理4级合规改造倒计时

更多请点击: https://kaifayun.com 第一章:AI Agent医疗行业应用 AI Agent正以前所未有的深度融入医疗健康全链条,从辅助诊断、个性化治疗规划到慢病管理与药物研发,展现出强推理、多工具协同与持续学习的核心能力。不同于传统静…...

Java SE与Spring Boot在电商场景中的面试问题

Java SE和Spring Boot的微服务架构在电商场景中的应用面试官(严肃):面试开始,我们先从基础开始说起,你能简单讲讲Java SE的几个主要特性吗? 燕双非(搞笑):当然可以&#…...

Sunshine虚拟手柄终极指南:解决游戏串流控制难题

Sunshine虚拟手柄终极指南:解决游戏串流控制难题 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 在游戏串流体验中,最令人沮丧的莫过于手柄连接失败、按键映…...

5大原神游戏痛点与BetterGI的智能解决方案

5大原神游戏痛点与BetterGI的智能解决方案 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 | 自动烹饪 - UI Automatio…...

NCM转MP3完整指南:3步解锁网易云音乐加密文件

NCM转MP3完整指南:3步解锁网易云音乐加密文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾在网易云音乐下载了喜爱的歌曲,却发现只能在官方客户端播放?NCM加密格式限制了音乐的自由使用…...

终极指南:如何用MAA明日方舟助手告别重复操作,轻松实现游戏自动化

终极指南:如何用MAA明日方舟助手告别重复操作,轻松实现游戏自动化 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. …...

Wand-Enhancer:如何通过本地客户端增强技术提升Wand应用体验

Wand-Enhancer:如何通过本地客户端增强技术提升Wand应用体验 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer Wand-Enhancer是一款针对Wand&a…...

突破小红书反爬:5个User-Agent伪装策略与实战指南

突破小红书反爬:5个User-Agent伪装策略与实战指南 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接&#xf…...

茉莉花插件:3分钟搞定Zotero中文文献管理的完整指南

茉莉花插件:3分钟搞定Zotero中文文献管理的完整指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在为Zotero无法…...

小红书数据采集Python实战:3个技巧让你轻松获取公开内容

小红书数据采集Python实战:3个技巧让你轻松获取公开内容 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 你是否曾经想要分析小红书上的热门话题,却苦…...

终极模组管理指南:XXMI启动器让你的米哈游游戏体验提升10倍

终极模组管理指南:XXMI启动器让你的米哈游游戏体验提升10倍 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher XXMI启动器是一款专为米哈游系列游戏设计的开源模组管理平…...

终极指南:如何用WeChatIntercept实现macOS微信防撤回功能

终极指南:如何用WeChatIntercept实现macOS微信防撤回功能 【免费下载链接】WeChatIntercept 微信防撤回插件,一键安装,仅MAC可用,支持v3.7.0微信 项目地址: https://gitcode.com/gh_mirrors/we/WeChatIntercept 还在为微信…...

DS4Windows实战指南:在Windows上完美使用PS4手柄的终极解决方案

DS4Windows实战指南:在Windows上完美使用PS4手柄的终极解决方案 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 在Windows系统上使用PS4手柄玩游戏时,你是否遇到过…...

3大显示技术挑战:ColorControl如何实现专业级色彩管理与设备控制

3大显示技术挑战:ColorControl如何实现专业级色彩管理与设备控制 【免费下载链接】ColorControl Easily change NVIDIA display settings and/or control LG TVs 项目地址: https://gitcode.com/gh_mirrors/co/ColorControl 在数字内容创作和多媒体消费日益普…...

基于XAI与增量删除的地球观测数据特征精炼实战

1. 项目概述与核心思路在机器学习项目中,我们常常陷入一个思维定式:数据越多,模型性能就越好。尤其是在处理地球观测这类多模态、高维度的时序数据时,从哨兵卫星的光谱波段、气象站的小时级观测到静态地形数据,我们习惯…...

5步掌握Poppler-Windows部署:解决Windows环境PDF处理难题

5步掌握Poppler-Windows部署:解决Windows环境PDF处理难题 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 对于需要在Windows平台进行PD…...

5步解决Windows包管理器Winget安装难题:专业修复指南

5步解决Windows包管理器Winget安装难题:专业修复指南 【免费下载链接】winget-install Install WinGet using PowerShell! Prerequisites automatically installed. Works on Windows 10/11 and Server 2019/2022. 项目地址: https://gitcode.com/gh_mirrors/wi/w…...

如何用ncmdump实现NCM音乐格式的终极自由转换

如何用ncmdump实现NCM音乐格式的终极自由转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM文件无法在其他播放器播放而烦恼吗?ncmdump是一款专门解决NCM加密格式限制的开源工具,…...

GitHub中文插件:打破语言壁垒,让开源协作更顺畅

GitHub中文插件:打破语言壁垒,让开源协作更顺畅 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 你是否曾在Git…...

解决Windows游戏控制器兼容性问题:ViGEmBus内核驱动完整实现指南

解决Windows游戏控制器兼容性问题:ViGEmBus内核驱动完整实现指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 在Windows游戏开发和控制器应用…...

魔兽争霸3终极优化指南:5分钟解决画面拉伸与帧率限制难题

魔兽争霸3终极优化指南:5分钟解决画面拉伸与帧率限制难题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏魔兽争霸3在现代电…...

智慧树刷课插件:3分钟搞定网课,解放你的宝贵时间![特殊字符]

智慧树刷课插件:3分钟搞定网课,解放你的宝贵时间!🚀 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台的…...