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

flutter的状态管理学习

文章目录

        • 1.flutter widget分类
        • 2. 代理组件又分为
        • 3. 状态 state 数据
        • 4. 刷新 数据变化
        • 5. code

1.flutter widget分类
  1. 组合
  2. 渲染
  3. 代理
2. 代理组件又分为
  1. Positioned向父组件传递数据
  2. InheritedWidget向子组件传递数据
3. 状态 state 数据

状态就是用到了向子组件传递数据,并且需要刷新的时候刷新组件

4. 刷新 数据变化
  1. 获取并在改变的时候会导致刷新
    dependOnInheritedWidgetOfExactType
  2. 只获取不会因为数据变化导致刷新
    getInheritedWidgetOfExactType
5. code
import 'package:flutter/material.dart';//material cupertino
//widget
//rendering
//foundation 动画 事件 painting
//flutter框架层
//engine
//embedded嵌入式main() {runApp(const MaterialApp(home: StateStudyPage(),));
}class StateStudyPage extends StatefulWidget {const StateStudyPage({super.key});State<StateStudyPage> createState() => _StateStudyPageState();
}class _StateStudyPageState extends State<StateStudyPage> {int aa = 0;int dt1 = 0;int dt2 = 0;Widget build(BuildContext context) {return Scaffold(appBar: AppBar(),body: ShareData2Widget(dt1: dt1,dt2: dt2,child: Column(children: [Text("parent=$aa"),TextButton(onPressed: () {setState(() {aa++;});},child: Text("刷新当前state")),TextButton(onPressed: () {setState(() {dt1++;});},child: Text("刷新当前state dt1=$dt1")),TextButton(onPressed: () {setState(() {dt2++;});},child: Text("刷新当前state dt2=$dt2")),StateStudyChildPage(aa: aa,),],),),);}
}class StateStudyChildPage extends StatefulWidget {final int aa;const StateStudyChildPage({super.key, required this.aa});State<StateStudyChildPage> createState() => _StateStudyChildPageState();
}class _StateStudyChildPageState extends State<StateStudyChildPage> {int a = 0;///由于父widget setState 导致该方法调用void didUpdateWidget(covariant StateStudyChildPage oldWidget) {super.didUpdateWidget(oldWidget);print("更新widget");}///由于用到了共享数据,并在数据变化的时候调用了父组件的setState,导致该方法调用void didChangeDependencies() {super.didChangeDependencies();print("依赖变化");}Widget build(BuildContext context) {return Column(children: [Text("child=$a"),Text("child==aa=${widget.aa}"),Text("child==cc=${ShareData2Widget.of(context, "data")?.dt1}"),TextButton(onPressed: () {setState(() {a++;});},child: Text("刷新当前state"))],);}
}///整体数据刷新
class ShareDataWidget extends InheritedWidget {const ShareDataWidget({super.key,required this.data,required super.child,});final int data; //需要在子树中共享的数据,保存点击次数//定义一个便捷方法,方便子树中的widget获取共享数据static ShareDataWidget? of(BuildContext context) {return context.dependOnInheritedWidgetOfExactType<ShareDataWidget>();}//该回调决定当data发生变化时,是否通知子树中依赖data的Widget重新buildbool updateShouldNotify(ShareDataWidget oldWidget) {return oldWidget.data != data;}
}///局部数据导致刷新
class ShareData2Widget extends InheritedModel<String> {const ShareData2Widget({super.key,required this.dt2,required this.dt1,required super.child,});final int dt1;final int dt2;//定义一个便捷方法,方便子树中的widget获取共享数据//type就是根据type来判断是否需要刷新组件static ShareData2Widget? of(BuildContext context, String type) {return context.dependOnInheritedWidgetOfExactType<ShareData2Widget>(aspect: type);}//该回调决定当data发生变化时,是否通知子树中依赖data的Widget重新buildbool updateShouldNotify(ShareData2Widget oldWidget) {print("oldWidget.dt1 != dt1=${oldWidget.dt1 != dt1}");return oldWidget.dt1 != dt1 || oldWidget.dt2 != dt2;}bool updateShouldNotifyDependent(covariant ShareData2Widget oldWidget, Set<String> dependencies) {return dependencies.contains("data") && oldWidget.dt1 != dt1 ||dependencies.contains("data2") && oldWidget.dt2 != dt2;}
}

相关文章:

  • vscode运行Python的两种方法,及无法运行的原因
  • Go语言实现各种hash算法
  • C //练习 4-4 在栈操作中添加几个命令,分别用在不弹出元素的情况下打印栈顶元素;复制栈顶元素;交换栈顶两个元素的值。另外增加一个命令用于清空栈。
  • ssm基于Javaweb的网上奶茶店系统的设计与实现论文
  • xtu-c语言考试复习-2
  • RAG(检索增强生成 )
  • vercel部署twikoo后评论收不到通知邮件问题解决方法
  • 飞桨分子动力学模拟-论文复现第六期:复现TorchMD
  • 奇怪的事情记录:外置网卡和外置显示器不兼容
  • Ceph入门到精通-通过 CloudBerry Explorer 管理对象bucket
  • ssh远程登陆
  • Kubernetes 集群管理—日志架构
  • iOS14 Widget 小组件调研
  • UniRepLKNet实战:使用 UniRepLKNet实现图像分类任务(二)
  • 7个Linux搜索和过滤命令
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Java,console输出实时的转向GUI textbox
  • Java知识点总结(JavaIO-打印流)
  • JDK 6和JDK 7中的substring()方法
  • Map集合、散列表、红黑树介绍
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Netty 4.1 源代码学习:线程模型
  • PHP变量
  • python大佬养成计划----difflib模块
  • React的组件模式
  • Redis中的lru算法实现
  • vuex 学习笔记 01
  • 分享几个不错的工具
  • 基于webpack 的 vue 多页架构
  • 理解在java “”i=i++;”所发生的事情
  • 浏览器缓存机制分析
  • 山寨一个 Promise
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 积累各种好的链接
  • ​flutter 代码混淆
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (0)Nginx 功能特性
  • (7)STL算法之交换赋值
  • (四)鸿鹄云架构一服务注册中心
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Android学习笔记 --- android任务栈和启动模式
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .form文件_一篇文章学会文件上传
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 事件模型教程(二)
  • .NET 依赖注入和配置系统
  • .net开发时的诡异问题,button的onclick事件无效
  • @EnableConfigurationProperties注解使用
  • @NestedConfigurationProperty 注解用法
  • @PreAuthorize注解
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [.net]官方水晶报表的使用以演示下载
  • [2016.7.Test1] T1 三进制异或
  • [20161101]rman备份与数据文件变化7.txt