前端学习-flutter学习-004-状态管理

news/2024/10/6 5:23:43/文章来源:https://www.cnblogs.com/ayubene/p/18288612

《Flutter实战·第二版》

  • Widget管理自身状态:自己继承StatefulWidget,自己内部设置变量(State)并进行管理
  • 父Widget管理子Widget的状态:parent继承自StatefulWidget,设置变量及函数,传递给child;child继承自StatelessWidget
  • 混合状态管理:既接受来自parent的变量和函数,自己继承自StatefulWidget,内部也管理参数(状态)
  • 全局状态管理:需要一些跨组件(包括跨路由)的状态需要同步时(如设置应用的语言)
import 'package:flutter/material.dart';
import 'dart:ui';// import 'package:flutter/cupertino.dart';// void main() {//   runApp(const MyApp());// }void main() => runApp(const MyApp());// void main() => runApp(CupertinoApp(home: CupertinoTestRoute()));class MyApp extends StatelessWidget {const MyApp({super.key});// This widget is the root of your application.@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),useMaterial3: true,),home:  HomePage(),);}
}class HomePage extends StatelessWidget {const HomePage({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Widget管理自身状态"),backgroundColor: Colors.green,),body: Center(child: Column(children: [TapboxA(),ParentWidget(),ParentWidgetC(),],),),);// return CounterWidget();}
}// TapboxA 管理自身状态.
//------------------------- TapboxA ----------------------------------class TapboxA extends StatefulWidget {TapboxA({Key? key}) : super(key: key);@override_TapboxAState createState() => _TapboxAState();
}class _TapboxAState extends State<TapboxA> {bool _active = false;void _handleTap() {setState(() {_active = !_active;});}Widget build(BuildContext context) {return GestureDetector(onTap: _handleTap,child: Center(child: Container(child: Center(child: Text(_active ? 'Widget管理自身状态Active' : 'Widget管理自身状态Inactive',style: TextStyle(fontSize: 32.0, color: Colors.white),),),width: 200.0,height: 200.0,decoration: BoxDecoration(color: _active ? Colors.lightGreen[700] : Colors.grey[600],),),),);}
}// ParentWidget 为 TapboxB 管理状态.
//------------------------ ParentWidget --------------------------------class ParentWidget extends StatefulWidget {@override_ParentWidgetState createState() => _ParentWidgetState();
}class _ParentWidgetState extends State<ParentWidget> {bool _active = false;void _handleTapboxChanged(bool newValue) {setState(() {_active = newValue;});}@overrideWidget build(BuildContext context) {return Container(child: TapboxB(active: _active,onChanged: _handleTapboxChanged,),);}
}//------------------------- TapboxB ----------------------------------class TapboxB extends StatelessWidget {TapboxB({Key? key, this.active = false, required this.onChanged}): super(key: key);final bool active;final ValueChanged<bool> onChanged;void _handleTap() {onChanged(!active);}Widget build(BuildContext context) {return GestureDetector(onTap: _handleTap,child: Container(child: Center(child: Text(active ? '父Widget管理子Widget的状态Active' : '父Widget管理子Widget的状态Inactive',style: TextStyle(fontSize: 32.0, color: Colors.white),),),width: 200.0,height: 200.0,decoration: BoxDecoration(color: active ? Colors.lightGreen[700] : Colors.grey[600],),),);}
}// 混合状态管理
//---------------------------- ParentWidget ----------------------------class ParentWidgetC extends StatefulWidget {@override_ParentWidgetCState createState() => _ParentWidgetCState();
}class _ParentWidgetCState extends State<ParentWidgetC> {bool _active = false;void _handleTapboxChanged(bool newValue) {setState(() {_active = newValue;});}@overrideWidget build(BuildContext context) {return Container(child: TapboxC(active: _active,onChanged: _handleTapboxChanged,),);}
}//----------------------------- TapboxC ------------------------------class TapboxC extends StatefulWidget {TapboxC({Key? key, this.active = false, required this.onChanged}): super(key: key);final bool active;final ValueChanged<bool> onChanged;@override_TapboxCState createState() => _TapboxCState();
}class _TapboxCState extends State<TapboxC> {bool _highlight = false;void _handleTapDown(TapDownDetails details) {setState(() {_highlight = true;});}void _handleTapUp(TapUpDetails details) {setState(() {_highlight = false;});}void _handleTapCancel() {setState(() {_highlight = false;});}void _handleTap() {widget.onChanged(!widget.active);}@overrideWidget build(BuildContext context) {// 在按下时添加绿色边框,当抬起时,取消高亮return GestureDetector(onTapDown: _handleTapDown, // 处理按下事件onTapUp: _handleTapUp, // 处理抬起事件onTap: _handleTap,onTapCancel: _handleTapCancel,child: Container(child: Center(child: Text(widget.active ? '混合状态管理Active' : '混合状态管理Inactive',style: TextStyle(fontSize: 32.0, color: Colors.white),),),width: 200.0,height: 200.0,decoration: BoxDecoration(color: widget.active ? Colors.lightGreen[700] : Colors.grey[600],border: _highlight? Border.all(color: Colors.teal,width: 10.0,): null,),),);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/740015.html

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

相关文章

03-码出高效:Java开发手册.pdf

03-码出高效:Java开发手册.pdf 03-码出高效:Java开发手册.pdf ​​ ​​ ‍ ​​ ‍ ‍

Franka Emika Datasheet(技术参数)

任何人均可随时随地实现自动化。 Franka Emika 是德国慕尼黑的一家深科技公司,该公司致力于创造全新的机器人平台技术,提高性能,改善每个人的访问便捷 性,从而克服现代社会面临的最大难题之一,让整整一代人摆脱枯燥乏味、存在潜在危险且极其耗时的劳动和工作。为了实现高 …

Ubuntu 22.04搭建MC原版服务端

首先下载 JAVA 版服务器 https://www.minecraft.net/zh-hans/download/server服务器下载java 21。这里我看了需求,如果你开mc服务器从1.20.5(24w14a)开始,运行Minecraft的最低要求是Java 21,且操作系统要求为64位。 apt install openjdk-21-jdk 运行就行。java -Xmx1G -Xm…

小学期第一周(7.1-7.7)

7.1 周一 为啥被人学校都放假了我们还有小学期【微笑] 开玩笑其实我高兴得很,毕竟我是如此热爱学习 今天小学期一人分了四道题我把每道题都看了看答案最后选了四道代码比较少的,这样验收的时候还简单点 什么?问我为什么从网上 找答案不自己写?那我也得会写才行啊,我的基础…

大气热力学(7)——湿度参数

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记,现转化为电子版本以作存档。相较于手写笔记,电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 目录7.1 大气湿度的概念7.2 水汽压7.2.1 水汽压7.2.2 饱和水汽压7.2.3 饱和差7.3 混合比与比湿7…

pandas 检查表单指定列是否有重复数据【实际业务实践】

pandas 检查表单指定列是否有重复数据,重复时返回重复的数据,实际业务实践。一、业务需求 财务系统中提报业务时,需要检查业务附件中的两列是否在当前电子表格内重复。 比如检查 票据编号 + 子票区间 是否有重复。 二、业务数据 以下是脱敏的真实业务数据。制单号 制单状态 …

Kindle电子书_使用Calibre给kindle远程传书的两种方式:网页浏览器与KOreader客户端传书

因为想使用KOreader的无框架模式,不用看书看着看着就重启KOreader,所以打算找找有什么办法使用KOreader无线传书。查到具体办法之后顺便写一下在非越狱的kindle上使用自带浏览器配合Calibre传书的方法。 使用网页浏览器点击Calibre的连接/共享中的“启动内容服务器”的选项,…

春秋杯 2024夏季

BEDTEA [题目制作过程]: 首先是通过矩阵相乘的方法来获取斐波那契数列来作为后面tea的每一轮的key,tea的轮数常数和左移右移都被魔改了,加了PEB的反调试,这个调试的作用是key从第几位取,如果正常运行则是从第三个开始取,考察师傅们面对tea的魔改的能力,然后将加密后的数…

西瓜杯 WP

RE 一个西瓜切两半你一半我一半 有点谜语,文本给的是输出和key # Visit https://www.lddgo.net/string/pyc-compile-decompile for more information # Version : Python 3.6flag= key = 一个西瓜切两半你一半我一半 # output=乃乾觅甯剏乳厡侻丨厏扝乌博丿乜规甲剌乶厝侥丿卻…

双亲委派机制和SPI的理解

双亲委派机制和SPI的理解 双亲委派机制基本原理 双亲委派机制简单的来说是JVM类加载过程的一个非强约束模型。子类加载器加载对应的Class,不会直接加载,首先会交由其父类加载器加载,若父类加载器无法加载,则由自己加载。 Java一共有三层类加载器,级别从上往下依次是:Boot…

Simple WPF: WPF 自定义按钮外形

WPF的按钮提供了Template模板,可以通过修改Template模板中的内容对按钮的样式进行自定义。结合资源字典,可以将自定义资源在xaml窗口、自定义控件或者整个App当中调用最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。 WPF的按钮提供了Template模板,可以…

三维重建工作的一些调研

GPT关于3D-GS的回答如果我获得了一个3D高斯溅射的表达,给定任意的相机内参和外参,是不是就能生成一副2D图像Yes, given a 3D Gaussian splatting representation and the intrinsic and extrinsic camera parameters, you can generate a 2D image from any desired viewpoin…