Flutter状态管理Provider示例解析
作者:顾安 时间:2023-02-10 07:09:17
什么是状态管理
状态管理是一个十分广泛的概念,因为状态无处不在。从广义角度讲状态管理就是页面跟代码、跟服务器进行数据同步。例如:你在某购物应用内,添加了一件商品,你需要在购物车页面进行展示。这就是一种状态。相反的,你在商品页面点击了添加到购物车,却在购物车页面没有发现或者过段时间它才展示了,这就是状态管理没有做好。这就是我所理解的状态管理。
官方给出的解释:状态管理就是当某个状态发生改变的时候,告知使用该状态的状态监听者,让状态所监听的属性随之改变,从而达到联动效果。
常见的状态管理框架有哪些
Provider
Provider是官方文档的例子用的方法,Google 比较推荐的用法,也是今天的主角。Provider的实现在内部还是利用了InheritedWidget,它就是用于提供数据,可以很方便的管理状态。
Redux
Redux是一种单向数据流架构,可以轻松开发,维护和测试应用程序,也是google推荐的状态管理方式。所有的状态都存储在Store里,View拿到Store的状态数据会映射成视图渲染。Redux不直接让view操作数据,通过dispatch一个action通知Reducer,状态变更(类似于vue中的vuex)。
GetX
GetX包含很多功能,各种弹出widget、路由管理、国际化、Utils、状态管理等所以我觉得它不单单是一个状态管理器,更像是一个框架(类似于vue cli)。关于GetX的争论也很多,今天我们不讨论。我的建议是,对于像我一样的小白,还是从Provider开始,打好基础再说。
Provider 使用
添加依赖
使用命令行方式
flutter pub add provider
pubspec.yaml 添加这样一行(并运行隐式flutter pub get):
dependencies:
provider: ^6.0.4
导入应用
import 'package:provider/provider.dart';
定义需要共享的数据
class ProviderData with ChangeNotifier {
int count = 0;
void increment() {
count++;
notifyListeners();
}
}
在应用程序入口初始化
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import './provider/index.dart';
import './page/HomePage.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => CountNotifier(),
child: MaterialApp(
debugShowCheckedModeBanner: false,
home: const Scaffold(
body: HomePage(),
),
),
);
}
}
使用共享数据
import 'package:flutter/material.dart';
import 'package:flutter_provider_example/provider_count_example/count_notifier.dart';
import './provider/provider.dart';
class ProviderExample extends StatefulWidget {
const ProviderExample({Key? key}) : super(key: key);
@override
State<ProviderExample> createState() => _ProviderExampleState();
}
class _ProviderExampleState extends State<ProviderExample> {
final counter = Provider.of<ProviderData>(context);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("InheritedWidget"),
),
floatingActionButton: FloatingActionButton(
onPressed: (){
counter.increment();
},
child: const Icon(Icons.add),
),
body: Center(
child: Text(counter.count.toString(),
style: const TextStyle(
color: Colors.red,
fontSize: 50
),
),
),
);
}
}
状态管理的好处
能有效分离 UI 层和数据处理层
帮助前端应用结构化数据
有效控制状态的变化
处理同步与异步
实现一些日志打印,热加,同构应用等功能
...
结束语
关于flutter状态管理的学习到这里就结束了,更多关于Flutter状态管理Provider的资料请关注脚本之家其它相关文章!
来源:https://juejin.cn/post/7169045609909846046
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
完美解决IDEA Ctrl+Shift+f快捷键突然无效的问题
![](https://img.aspxhome.com/file/2023/5/127225_0s.jpg)
Kotlin中协程的创建过程详析
![](https://img.aspxhome.com/file/2023/8/130418_0s.png)
C#中使用闭包与意想不到的坑详解
![](https://img.aspxhome.com/file/2023/8/116618_0s.png)
Java 事务注解@Transactional回滚(try catch、嵌套)问题
Spring Cloud Hystrix 服务降级限流策略详解
![](https://img.aspxhome.com/file/2023/4/67104_0s.png)
mybatis项目CRUD步骤实例详解
![](https://img.aspxhome.com/file/2023/6/99906_0s.png)
Java游戏俄罗斯方块的实现实例
Android布局技巧之使用ViewStub
![](https://img.aspxhome.com/file/2023/9/137249_0s.png)
详解Android 中的文件存储
C#反射应用实例
![](https://img.aspxhome.com/file/2023/9/98209_0s.png)
Android实现图片的高斯模糊(两种方式)
![](https://img.aspxhome.com/file/2023/8/139518_0s.png)
c#在excel中添加超链接示例分享
带你入门Java的泛型
android音频编辑之音频裁剪的示例代码
![](https://img.aspxhome.com/file/2023/0/138160_0s.png)
一篇文章带你深入了解Java线程池
SpringBoot深入探究@Conditional条件装配的使用
![](https://img.aspxhome.com/file/2023/2/61792_0s.png)
Spring RestTemplate的使用与踩坑
MyEclipse设置Console输出到文件的实现方法
![](https://img.aspxhome.com/file/2023/3/73023_0s.png)
java发送kafka事务消息的实现方法
![](https://img.aspxhome.com/file/2023/4/75514_0s.png)