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

Flutter中的各种刷新小部件

1.FutureBuilder

用于处理异步操作和构建界面的非常有用的小部件。它通常与 Future 对象一起使用,用于在异步操作完成后构建界面。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: MyHomePage(),);}
}class MyHomePage extends StatelessWidget {Future<String> fetchData() async {// 模拟异步操作,例如从网络请求数据await Future.delayed(Duration(seconds: 2));return "Hello, World!";}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("FutureBuilder Example"),),body: FutureBuilder<String>(future: fetchData(),builder: (BuildContext context, AsyncSnapshot<String> snapshot) {if (snapshot.connectionState == ConnectionState.waiting) {return Center(child: CircularProgressIndicator());} else if (snapshot.hasError) {return Center(child: Text("Error: ${snapshot.error}"));} else {return Center(child: Text("Data: ${snapshot.data}"));}},),);}
}

如果 FutureBuilder 在构建时频繁重建,可能会导致性能问题。确保不要将 FutureBuilder 嵌套在频繁重建的小部件内部,以避免不必要的性能开销。

2.StreamController

要实现流式刷新,通常需要使用 Stream 和 StreamBuilder 来监听和更新数据。

import 'dart:async';
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: MyHomePage(),);}
}class MyHomePage extends StatefulWidget {_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {StreamController<int> _dataStreamController = StreamController<int>();int _data = 0;void initState() {super.initState();// 模拟一个数据源,每秒生成一个新数据Timer.periodic(Duration(seconds: 1), (timer) {_dataStreamController.sink.add(_data++);});}void dispose() {_dataStreamController.close(); // 关闭流super.dispose();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("StreamBuilder Example"),),body: StreamBuilder<int>(stream: _dataStreamController.stream,builder: (BuildContext context, AsyncSnapshot<int> snapshot) {if (snapshot.connectionState == ConnectionState.waiting) {return Center(child: CircularProgressIndicator());} else if (snapshot.hasError) {return Center(child: Text("Error: ${snapshot.error}"));} else {return Center(child: Text("Data: ${snapshot.data}"));}},),);}
}

3.ValueListenableBuilder

用于监听 ValueListenable 对象的值变化并构建界面。它允许你在值发生变化时更新界面,而无需重建整个小部件树。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class CounterModel extends ValueNotifier<int> {CounterModel(int value) : super(value);
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {final counterModel = CounterModel(0);return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('ValueListenableBuilder Example'),),body: Center(child: ValueListenableBuilder<int>(valueListenable: counterModel,builder: (BuildContext context, int value, Widget child) {return Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text('Counter Value: $value'),ElevatedButton(onPressed: () {counterModel.value++;},child: Text('Increment'),),],);},),),),);}
}

4.LayoutBuilder

用于获取父级小部件的约束信息并根据约束信息自定义构建界面。它通常用于创建根据父级尺寸动态调整的小部件,如自适应布局。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('LayoutBuilder Example'),),body: Center(child: Container(color: Colors.blue,width: 200.0,height: 200.0,child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) {return Center(child: Text('Width: ${constraints.maxWidth.toStringAsFixed(2)}\nHeight: ${constraints.maxHeight.toStringAsFixed(2)}',style: TextStyle(color: Colors.white),),);},),),),),);}
}

5.AnimatedBuilder

用于在动画执行过程中监听值的变化并构建界面的小部件。通常,它与 AnimationController 或其他动画对象一起使用,以便在动画执行期间更新界面。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('AnimatedBuilder Example'),),body: Center(child: MyAnimationWidget(),),),);}
}class MyAnimationWidget extends StatefulWidget {_MyAnimationWidgetState createState() => _MyAnimationWidgetState();
}class _MyAnimationWidgetState extends State<MyAnimationWidget>with SingleTickerProviderStateMixin {AnimationController _controller;Animation<double> _animation;void initState() {super.initState();_controller = AnimationController(vsync: this,duration: Duration(seconds: 2),);_animation = Tween(begin: 0.0, end: 1.0).animate(_controller)..addListener(() {// 当动画值发生变化时重建界面setState(() {});});_controller.forward();}void dispose() {_controller.dispose();super.dispose();}Widget build(BuildContext context) {return AnimatedBuilder(animation: _controller,builder: (BuildContext context, Widget child) {return Opacity(opacity: _animation.value,child: Container(color: Colors.blue,width: 200.0,height: 200.0,child: Center(child: Text('Opacity: ${_animation.value.toStringAsFixed(2)}',style: TextStyle(color: Colors.white),),),),);},);}
}

6.PageRouteBuilder

用于自定义页面过渡动画的小部件,通常与 Navigator 一起使用。它允许你创建自定义的页面切换效果,包括滑动、渐变、缩放等动画效果。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: MyHomePage(),);}
}class MyHomePage extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('PageRouteBuilder Example'),),body: Center(child: ElevatedButton(onPressed: () {Navigator.of(context).push(PageRouteBuilder(pageBuilder: (context, animation, secondaryAnimation) {return SecondPage();},transitionsBuilder: (context, animation, secondaryAnimation, child) {const begin = Offset(1.0, 0.0);const end = Offset.zero;const curve = Curves.easeInOut;var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));var offsetAnimation = animation.drive(tween);return SlideTransition(position: offsetAnimation,child: child,);},),);},child: Text('Go to Second Page'),),),);}
}class SecondPage extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Second Page'),),body: Center(child: ElevatedButton(onPressed: () {Navigator.of(context).pop();},child: Text('Back to First Page'),),),);}
}

7.AnimatedSwitcher

用于在切换不同小部件时执行动画的小部件。它允许你在切换小部件时应用自定义的入场和出场动画效果。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: MyHomePage(),);}
}class MyHomePage extends StatefulWidget {_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {bool _showFirstWidget = true;void _toggleWidget() {setState(() {_showFirstWidget = !_showFirstWidget;});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('AnimatedSwitcher Example'),),body: Center(child: AnimatedSwitcher(duration: Duration(milliseconds: 500), // 切换动画的持续时间child: _showFirstWidget? FirstWidget(key: ValueKey<int>(1), // 指定不同的 key 以区分不同的小部件): SecondWidget(key: ValueKey<int>(2), // 指定不同的 key 以区分不同的小部件),),),floatingActionButton: FloatingActionButton(onPressed: _toggleWidget,child: Icon(Icons.swap_horiz),),);}
}class FirstWidget extends StatelessWidget {FirstWidget({Key key}) : super(key: key);Widget build(BuildContext context) {return Container(key: key,width: 200,height: 200,color: Colors.blue,child: Center(child: Text('First Widget',style: TextStyle(color: Colors.white),),),);}
}class SecondWidget extends StatelessWidget {SecondWidget({Key key}) : super(key: key);Widget build(BuildContext context) {return Container(key: key,width: 200,height: 200,color: Colors.green,child: Center(child: Text('Second Widget',style: TextStyle(color: Colors.white),),),);}
}

8.FormBuilder

FormBuilder 是一个 Flutter 插件,用于简化表单的创建和处理。它通过创建表单字段和验证逻辑,让表单管理更容易。

dependencies:flutter_form_builder: ^9.1.1
final GlobalKey<FormBuilderState> _formKey = GlobalKey<FormBuilderState>();
Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Login Form'),),body: Padding(padding: const EdgeInsets.all(16.0),child: FormBuilder(key: _formKey,autovalidateMode: AutovalidateMode.always, // 自动验证模式child: Column(children: <Widget>[FormBuilderTextField(name: 'username',decoration: InputDecoration(labelText: 'Username'),validator: FormBuilderValidators.required(context),),FormBuilderTextField(name: 'password',decoration: InputDecoration(labelText: 'Password'),validator: FormBuilderValidators.required(context),),SizedBox(height: 20),ElevatedButton(onPressed: () {if (_formKey.currentState.saveAndValidate()) {// 表单验证通过,执行提交操作print(_formKey.currentState.value);}},child: Text('Submit'),),],),),),);
}

相关文章:

Flutter中的各种刷新小部件

1.FutureBuilder 用于处理异步操作和构建界面的非常有用的小部件。它通常与 Future 对象一起使用&#xff0c;用于在异步操作完成后构建界面。 import package:flutter/material.dart;void main() > runApp(MyApp());class MyApp extends StatelessWidget {overrideWidget…...

DataxWeb安装部署及使用--真香警告

DataxWeb安装部署及使用–真香警告 文章目录 1.Datax简介1.1 Datax是什么&#xff1f;1.2 Datax的架构1.3 设计理念1.4 DataX3.0框架设计1.5 DataX3.0插件体系1.6 DataX3.0核心架构1.6.1 核心模块介绍1.6.2 DataX调度流程 2.DataxWeb简介2.1 DataxWeb是什么&#xff1f;2.2 Dat…...

OpenCV 笔记(4):图像的算术运算、逻辑运算

Part11. 图像的算术运算 图像的本质是一个矩阵&#xff0c;所以可以对它进行一些常见的算术运算&#xff0c;例如加、减、乘、除、平方根、对数、绝对值等等。除此之外&#xff0c;还可以对图像进行逻辑运算和几何变换。 我们先从简单的图像加、减、逻辑运算开始介绍。后续会有…...

创建ABAP数据库表和ABAP字典对象-使用已存在的数据元素增加城市字段04

基于内置域增加一个字段 1.在编辑器中&#xff0c;输入字段的名称&#xff0c;后跟冒号:city:。暂时忽略这个错误。2. 输入/MOC/C并使用自动补全(**Ctrl空格**)&#xff0c;输入类型。3. 然后添加一个分号:city: /moc/city;4.在SAP GUI中查看&#xff0c;字段已经新增...

Centos7上安装 Node.js

文章目录 一、前言二、步骤三、涉及nodejs&#xff0c;centos还是少用吧 一、前言 centos7安装nodejs如果直接安装较高版本会包错误&#xff0c;无法运行npm node: /lib64/libm.so.6: version GLIBC_2.27‘ not found (required by node)二、步骤 网上说的下载升级编译器的方…...

栈及其栈的模拟实现和使用

1. 栈(Stack) 1.1 概念 栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO &#xff08; Last In First Out &#xff09;的原则…...

HarmonyOS开发:开源一个刷新加载组件

前言 系统Api中提供了下拉刷新组件Refresh&#xff0c;使用起来也是非常的好用&#xff0c;但是风格和日常的开发&#xff0c;有着巨大的出入&#xff0c;效果如下&#xff1a; 显然上面的效果是很难满足我们实际的需求的&#xff0c;奈何也没有提供的属性可以更改&#xff0c;…...

XSSFWorkbook读取模板,批量填充并导出文件

1、pom文件导入 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.0</version> </dependency> <dependency><groupId>org.apache.poi</groupId><artifactId>…...

Lazada新店运营秘籍自养号测评技术

跨境行业的前途虽然大好&#xff0c;但要想真正从中分一杯羹并非易事。东南亚市场前景大好&#xff0c;而作为其主流在线购物网站之一&#xff0c;Lazada吸引了众多卖家和买家。作为新手来说&#xff0c;注册好Lazada之后&#xff0c;店铺下一步该怎么做呢&#xff1f;赶紧来看…...

python:逐像素处理遥感数据时间序列数据(求时间序列最大值、最大值所对应的索引、最大值所在的时间)

作者:CSDN @ _养乐多_ 本文记录了使用gdal、ras、numpy 库实现遥感时间序列数据逐像素处理的代码。并以求NADVI时间序列最大值为例。代码可扩展到其他多种对时间序列的处理,比如MK趋势分析,求时间序列中值、众数、标准差、和,时间序列拟合、异常检测、机器学习预测等多种应…...

SpringCloudGateway--过滤器(自定义filter)

目录 一、概览 二、通过GatewayFilter实现 三、继承AbstractGatewayFilterFactory 一、概览 当使用Spring Cloud Gateway构建API网关时&#xff0c;可以利用Spring Cloud Gateway提供的内置过滤器&#xff08;filter&#xff09;来实现对请求的处理和响应的处理。过滤器可以…...

【docker】安装 showdoc

1. 下载镜像 2.新建存放showdoc数据的目录 3.启动showdoc容器 4.打开网页 1. 下载镜像 # 原版官方镜像安装命令(中国大陆用户不建议直接使用原版镜像&#xff0c;可以用后面的加速镜像) docker pull star7th/showdoc # 中国大陆镜像安装命令&#xff08;安装后记得执行docke…...

智慧公厕:科技赋予公共卫生新生命,提升城市管理品质

在现代化城市中&#xff0c;公共卫生设施的发展与提升一直是对城市管理者和市民的共同期望。然而&#xff0c;传统的公共厕所常常令人困扰&#xff0c;脏乱臭成为难题。为了解决这一难题&#xff0c;广州中期科技科技有限公司全新升级的智慧公厕整体解决方案&#xff0c;补誉为…...

深度学习_2 数据操作之数据预处理

数据操作 机器学习包括的核心组件有&#xff1a; 可以用来学习的数据&#xff08;data&#xff09;&#xff1b;如何转换数据的模型&#xff08;model&#xff09;&#xff1b;一个目标函数&#xff08;objective function&#xff09;&#xff0c;用来量化模型的有效性&…...

在美团和阿里6年,很难却也真实...

先简单的说下&#xff0c;本人6年工作经验&#xff0c;曾就职于某大型国企&#xff0c;公司研究院成员&#xff0c;也就职过美团担任高级测试开发工程师&#xff0c;有丰富的高并发大型项目经验。 后端高并发、高性能、高可用性开发&#xff0c;自动化测试框架开发以及软件自动…...

2、NLP文本预处理技术:词干提取和词形还原

一、说明 在上一篇文章中&#xff0c;我们解释了文本预处理的重要性&#xff0c;并解释了一些文本预处理技术。在本文中&#xff0c;我们将介绍词干提取和词形还原主题。 词干提取和词形还原是两种文本预处理技术&#xff0c;用于将单词还原为其基本形式或词根形式。这些技术的…...

Fabric官方示例测试网络搭建

目录 一、参考文档二、环境依赖三、Fabric源码安装3.1、创建链目录3.2、下载源码3.3、修改安装脚本3.4、开始安装3.4.1、执行安装脚本3.4.2、手动下载ca和二进制配置包 四、启动测试网络五、使用测试网络5.1、创建应用通道5.2、部署链码5.3、发送交易 六、关闭测试网络 一、参考…...

ubuntu20.04 conda pack 打包虚拟环境,直接将其用到其他终端

在本机ubuntu20.04下配置的虚拟环境&#xff0c;想到将其整个放到新建的docker(ubuntu20.04)下使用&#xff0c;操作步骤如下&#xff1a; # 一、在ubuntu1下打包虚拟环境 # 安装conda-pack pip install conda-pack# 进入需要打包的虚拟环境,这里将目标虚拟环境名称为goal_env…...

云原生-AWS EC2使用、安全性及国内厂商对比

目录 什么是EC2启动一个EC2实例连接一个实例控制台ssh Security groups规则默认安全组与自定义安全组 安全性操作系统安全密钥泄漏部署应用安全元数据造成SSRF漏洞出现时敏感信息泄漏网络设置错误 厂商对比参考 本文通过实操&#xff0c;介绍了EC2的基本使用&#xff0c;并在功…...

【Proteus仿真】【Arduino单片机】简易电子琴

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用无源蜂鸣器、按键等。 主要功能&#xff1a; 系统运行后&#xff0c;按下K1-K7键发出不同音调。 二、软件设计 /* 作者&#xff1a;嗨小易&a…...

OpenClaw健康助手:Qwen3-32B分析智能穿戴数据生成周报

OpenClaw健康助手&#xff1a;Qwen3-32B分析智能穿戴数据生成周报 1. 为什么需要本地化健康数据分析 去年我开始使用智能手环监测睡眠和运动数据&#xff0c;但很快发现一个问题&#xff1a;所有数据都要上传到厂商云端才能生成报告。作为医疗行业从业者&#xff0c;我深知健…...

OpenClaw离线部署方案:Qwen3-32B镜像在无网络环境中的适配改造

OpenClaw离线部署方案&#xff1a;Qwen3-32B镜像在无网络环境中的适配改造 1. 离线部署的核心挑战与解决思路 去年在给某研究所部署内部知识管理系统时&#xff0c;我第一次遇到完全隔离的局域网环境。当时尝试用OpenClaw对接Qwen模型&#xff0c;发现官方默认安装流程完全依…...

当企业拥有了创新的 “上帝视角”,会发生什么?

当企业拥有了创新的 “上帝视角”&#xff0c;会发生什么&#xff1f;&#xff0d;&#xff0d;研企配 AI 大数据&#xff0c;打开中国企业产业洞察的上帝之窗在商业史上&#xff0c;所有的溃败都始于认知的闭环。14年前&#xff0c;诺基亚CEO约玛奥利拉在手机业务售出的发布会…...

Zotero文献元数据拯救指南:从混乱到规范的自动化解决方案

Zotero文献元数据拯救指南&#xff1a;从混乱到规范的自动化解决方案 【免费下载链接】zotero-format-metadata Linter for Zotero. A plugin for Zotero to format item metadata. Shortcut to set title rich text; set journal abbreviations, university places, and item …...

2026-04-03 全国各地响应最快的 BT Tracker 服务器(联通版)

数据来源&#xff1a;https://bt.me88.top 序号Tracker 服务器地域网络响应(毫秒)1http://211.75.210.221:6969/announce江苏镇江联通222http://60.249.37.20:80/announce广东肇庆联通273udp://132.226.6.145:6969/announce宁夏银川联通724http://93.158.213.92:1337/announce…...

Elsevier投稿状态监控插件:3分钟告别手动刷新的终极解决方案

Elsevier投稿状态监控插件&#xff1a;3分钟告别手动刷新的终极解决方案 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 你是否每天都要反复登录Elsevier投稿系统&#xff0c;只为查看那迟迟不来的审稿状态&#xf…...

【从零开始学Java | 第二十五篇】TreeSet

目录 前言 一、TreeSet的特点 二、TreeSet集合默认的规则 1.默认排序/自然排序 2.比较器排序 总结 前言 在 Java 的集合框架中&#xff0c;Set 接口代表了一个不允许存在重复元素的集合。我们最常用的通常是 HashSet&#xff0c;因为它提供了极高的查找和插入效率。但是&…...

H5动态公共导航栏

CommonNavBar.vue&#xff1a; <template><divclass"common-nav-bar":style"navBarStyle"><!-- 状态栏占位&#xff0c;可以按项目需要删除或调整高度 --><div class"status-bar-placeholder"></div><!-- 主导…...

OpenClaw × 88API:10 分钟搭好本地网关,解决 API 超时和多渠道切换(2026 完整教程)

你可能也踩过这些坑&#xff1a;项目快提测了&#xff0c;Claude API 突然超时&#xff0c;重试半天还是报错想临时换一个中转站兜底&#xff0c;结果又要改一遍 base_url、api_key、模型名一个渠道支持 Claude&#xff0c;不支持 Gemini&#xff1b;另一个支持 GPT&#xff0c…...

建议收藏!我开发了一个免费无限制的AI绘画公益站!

大家好&#xff0c;最近我做了一个小网站&#xff0c;叫 Dreamify &#xff0c;一个可以让你随便玩AI画画的小工具。不收费、不限次数、不用登录&#xff0c;想画就画&#xff0c;全凭兴趣。 今天就想简单分享一下它&#xff0c;顺便邀请你也来玩玩看。 &#x1f3a8; 为什么…...