Flutter学习11 - Future 与 FutureBuilder

1、Future

  • 可以利用 Future 实现异步调用

1.1、Future 的两种形式

自定义一个结果类

class Response {String _data;Response(this._data);
}

自定义方法实现 Future

Future<Response> testFuture() {var random = Random();int randomNumber = random.nextInt(10);if (randomNumber % 2 == 0) {return Future.value(Response('success: 偶数 $randomNumber'));} else {return Future.error('error: 奇数 $randomNumber');}
}
(1) then - onError
void main() {testFuture().then((value) {print(value._data);}, onError: (e) {print('1、onError: $e');});
}
(2) then - catchError
void main() {testFuture().then((value) {print(value._data);}).catchError((e) {print('2、catchError: $e');});
(3) 注意:当 onError 与 catchError 同时存在,只会调用 onError
void main() {//注:当 onError 与 catchError 同时存在,只会执行 onErrortestFuture().then((value) {print(value._data);}, onError: (e) {print('3、onError: $e');}).catchError((e) {print('3、catchError: $e');});
}

1.2、Future.whenComplete

then - catchError - whenComplete 类似于 try - catch - finally

Future<String> testFutureWhenComplete() {var random = Random();int randomNumber = random.nextInt(10);if (randomNumber % 2 == 0) {return Future.value('success: 偶数 $randomNumber');} else {return Future.error('error: 奇数 $randomNumber');}
}
void main(){testFutureWhenComplete().then(print).catchError(print).whenComplete(() {print('完成!!!');});
}

1.3、Future.timeout

Future<String> testFutureTimeout() {return Future.delayed(const Duration(seconds: 2), () {var random = Random();int randomNumber = random.nextInt(10);if (randomNumber % 2 == 0) {return Future.value('success: 偶数 $randomNumber');} else {return Future.error('error: 奇数 $randomNumber');}});
}
void main(){//TimeoutException after 0:00:01.000000: Future not completed// Done!!!testFutureTimeout().timeout(const Duration(seconds: 1)).then(print).catchError(print).whenComplete(() {print('Done!!!');});
}

2、FutureBuilder

  • FutureBuilder 是一个将异步操作和异步UI结合在一起的控件

在这里插入图片描述

2.1、构造函数

FutureBuilder({Key key, Future<T> future, T initialData,  AsyncWidgetBuilder<T> builder })
initialDataFuture完成前的初始化数据
future异步操作,返回Future对象
builder异步UI
builder
  • builder函数接受两个参数BuildContext context 与 AsyncSnapshot snapshot,返回一个widget
final AsyncWidgetBuilder<T> builder;
typedef AsyncWidgetBuilder<T> = Widget Function(BuildContext context, AsyncSnapshot<T> snapshot);
AsyncSnapshot 包含信息
  • connectionState:表示与异步计算的连接状态,ConnectionState有四个值:none,waiting,active,done
none当前未连接到异步计算
waiting连接到异步计算等待交互
active异步计算进行中
done异步计算完成
  • data:异步计算接收到的最新数据
  • error:异步计算接收到的最新错误数据
  • hasData:检查是否包含非空数据
  • hasError:检查是否包含错误值

2.2、代码示例

在这里插入图片描述

FutureBuilderDemo.dart

import 'dart:convert';import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;class FutureBuilderDemo extends StatefulWidget {const FutureBuilderDemo({super.key});State<FutureBuilderDemo> createState() => _FutureBuilderDemoState();
}class _FutureBuilderDemoState extends State<FutureBuilderDemo> {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('FutureBuilder Demo'),),body: FutureBuilder<PhoneEntity>(future: _doGet(),builder: (BuildContext context, AsyncSnapshot<PhoneEntity> snapshot) {switch (snapshot.connectionState) {case ConnectionState.none:return const Text('状态:无');case ConnectionState.waiting://进度条return const Center(child: CircularProgressIndicator(),);case ConnectionState.active:return const Text('状态:激活');case ConnectionState.done:if (snapshot.hasError) {//失败return Text('${snapshot.error}',style: const TextStyle(color: Colors.red),);} else {return Column(children: [Text('code: ${snapshot.data!.code}'),Text('city: ${snapshot.data!.data!.city}'),Text('province: ${snapshot.data!.data!.province}'),Text('sp: ${snapshot.data!.data!.sp}'),],);}}},),);}Future<PhoneEntity> _doGet() async {var url =Uri.parse('https://cx.shouji.360.cn/phonearea.php?number=17688888888');var response = await http.get(url);if (response.statusCode == 200) {//请求成功try {var json = response.body;var map = jsonDecode(json);var entity = PhoneEntity.fromJson(map);return Future.value(entity);} catch (e) {return Future.error('数据异常: ${e.toString()}');}} else {//请求失败return Future.error('请求失败 ! ! !');}}
}/**********************////
/// Code generated by jsonToDartModel https://ashamp.github.io/jsonToDartModel/
///
class PhoneEntityData {
/*
{"province": "广东","city": "广州","sp": "联通"
}
*/String? province;String? city;String? sp;PhoneEntityData({this.province,this.city,this.sp,});PhoneEntityData.fromJson(Map<String, dynamic> json) {province = json['province']?.toString();city = json['city']?.toString();sp = json['sp']?.toString();}Map<String, dynamic> toJson() {final data = <String, dynamic>{};data['province'] = province;data['city'] = city;data['sp'] = sp;return data;}
}class PhoneEntity {
/*
{"code": 0,"data": {"province": "广东","city": "广州","sp": "联通"}
}
*/int? code;PhoneEntityData? data;PhoneEntity({this.code,this.data,});PhoneEntity.fromJson(Map<String, dynamic> json) {code = json['code']?.toInt();data =(json['data'] != null) ? PhoneEntityData.fromJson(json['data']) : null;}Map<String, dynamic> toJson() {final data = <String, dynamic>{};data['code'] = code;if (data != null) {data['data'] = this.data!.toJson();}return data;}
}

main.dart

import 'package:flutter/material.dart';import 'FutureBuilderDemo.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(title: 'Leon Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: const FutureBuilderDemo(),);}
}

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

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

相关文章

【STM32G431RBTx】备战蓝桥杯嵌入式→省赛试题→第十四届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置&#xff0c;直接使用提供的资源包就行 2.KEY, 四个按键IO口都要配置&#xff0c;分别是PB0, PB1,PB2,PA…

albef论文学习

首先要知道vit是啥东西。vit就是transformer模型在图像领域的运用。 transformer模型原本是用于自然语言的&#xff0c;encoder和decoder接受的都是文字。vit把图像分割成很多个小块&#xff0c;把各个小块拉长当成向量来用&#xff0c;接下来就是一样的。最后接一个全连接层做…

Qt | Qt 的重要文件简介(推荐)

一、项目文件(pro 文件)及其语法 1、项目文件(pro 文件)的作用是列举项目中的源文件, 2、pro 文件的语法形式为:“变量 操作符 值”,比如 QT += widgets,多个值之间使用空格分开。 3、pro 文件的注释:从“#”开始,直至本行结束。 4、pro 文件的操作符见下表 5、pro 文…

RAG应用开发实战(01)-RAG应用框架和解析器

1 开源解析和拆分文档 第三方的工具去对文件解析拆分&#xff0c;去将我们的文件内容给提取出来&#xff0c;并将我们的文档内容去拆分成一个小的chunk。常见的PDF word mark down, JSON、HTML。都可以有很好的一些模块去把这些文件去进行一个东西去提取。 优势 支持丰富的文…

Spring Boot 框架集成Knife4j

本次示例使用 Spring Boot 作为脚手架来快速集成 Knife4j,Spring Boot 版本2.3.5.RELEASE,Knife4j 版本2.0.7&#xff0c;完整代码可以去参考 knife4j-spring-boot-fast-demo pom.xml 完整文件代码如下 <?xml version"1.0" encoding"UTF-8"?> &l…

Meta宣布全新训推一体加速器:完全集成PyTorch 2,性能3倍提升

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 Meta 疯狂砸入数十亿美元&#xff0c;一部分招揽人才&#xff0c;一部分造芯片。 Meta 正在不…

HCIE考试第三题:业务容器化及割接

文章目录 业务容器化及割接题目和做题步骤如下3.1业务容器化及割接3.1创建CCE集群solo3.2创建NAT网关3.2.1申请EIP3.2.2创建NAT网关3.2.3添加SNAT规则3.3创建节点池3.3.1 创建namespace3.3.2创建节点池3.4 安装命令行工具kubectl3.4.1上传kubectl3.4.2上传kubeconfig配置文件3.…

批归一化(BN)在神经网络中的作用与原理

文章目录 1. 批归一化&#xff08;BN&#xff09;在神经网络中的作用与原理1.1 作用与优势1.2 原理与推导 2. 将BN应用于神经网络的方法2.1 训练时的BN 2. 将BN应用于神经网络的方法2.1 训练时的BN2.2 测试时的BN代码示例&#xff08;Python&#xff09;&#xff1a; 3. BN的优…

做微信商城需要注意的几点问题

在社交平台做电商&#xff0c;已经非常常见&#xff0c;其中&#xff0c;最受欢迎的莫过于微信商城&#xff0c;基于微信公众号开发&#xff0c;进行宣传及变现&#xff0c;与用户建立长期双向联系&#xff0c;让用户形成长期稳定的购物习惯。看起来&#xff0c;这是一个很不错…

C++算法 —— 位运算

一、基本的位运算操作 1.基础位运算操作符 << : 二进制位整体左移 >> : 二进制位整体右移 ~ : 按位取反 & &#xff1a; 按位与 | &#xff1a; 按位或 ^ : 按位异或 &#xff08;无进位相加&#xff09; 2.给一个数n&#xff0c;确定它的二进制表示中第…

基于昇思的大地电磁智能反演模型达到业界SOTA,助力地球物理勘探加速智能化

近日&#xff0c;华为AI4S Lab与清华大学李懋坤教授团队、华为先进计算与存储实验室合作&#xff0c;基于昇腾AI处理器与昇思MindSpore AI框架打造了大地电磁智能反演模型。该模型通过变分自编码器&#xff08;VAE&#xff09;灵活嵌入了多物理先验知识&#xff0c;达到了业界S…

三次 Bspline(B样条曲线) NURBS曲线的绘制 matlab

先来了解几个概念&#xff1a; 1.1 节点向量&#xff1a; B-Spline需要定义曲线的节点向量U&#xff0c;它可以对应到Bezier曲线的参数u。 其元素个数 (m1) 和曲线阶数 k 、控制点个数n满足&#xff1a;m1k1n1 如果U的每段的距离是相等&#xff0c;那么这个B-Spline就被称为均…

多级菜单Mysql数据库表设计与创建

1.还是以Vue实现学院官网为例 文章地址&#xff1a;http://t.csdnimg.cn/jrJhE Vue 实现学院官网“菜单”当时是使用静态数据&#xff0c;也就是在页面上写死了的。 今天我们需要将“菜单”数据在数据库中进行维护&#xff0c;我们使用的是Mysql数据库 2.数据库的设计 我们的…

文心一言 VS 讯飞星火 VS chatgpt (234)-- 算法导论17.2 2题

二、用核算法重做练习17.1-3。练习17.1-3的内容是&#xff1a;假定我们对一个数据结构执行一个由 n 个操作组成的操作序列&#xff0c;当 i 严格为 2 的幂时第 i 个操作的代价为 i &#xff0c;否则代价为1。使用聚合分析确定每个操作的摊还代价。 文心一言&#xff1a; 练习…

Vue的学习之旅-part4

Vue的学习之旅-part1 vue的自带指令v-if v-else-if v-else虚拟DOM的复用v-show 与 v-if 的不同之处&#xff1a;v-if v-show各自合适的使用位置&#xff1a; v-for 循环v-for 循环遍历 :key"item" 绑定key&#xff0c;区分循环的内容循环的应用&#xff1a; 前几篇博…

基于SpringBoot+Vue的公园管理系统(源码+文档+部署+讲解)

一.系统概述 近年来&#xff0c;科技飞速发展&#xff0c;在经济全球化的背景之下&#xff0c;互联网技术将进一步提高社会综合发展的效率和速度&#xff0c;互联网技术也会涉及到各个领域&#xff0c;而公园管理系统在网络背景下有着无法忽视的作用。信息管理系统的开发是一个…

React + three.js 3D模型骨骼绑定

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制 项目代码(github)&#xff1a;https://github.com/couchette/simple-react-three-skeleton-demo 项目代码(gitcode)&#xff1a;https:…

保姆级Xshell安装教程

简介 Xshell 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以在Windows界面下用来访问远端不…

Windows:Redis数据库图形化中文工具软件——RESP(3)

这个是用于连接redis数据库的软件工具&#xff0c;安装在windows上的图形化界面&#xff0c;并且支持中文&#xff0c;是在github上的一个项目 1.获取安装包 发布 lework/RedisDesktopManager-Windows (github.com)https://github.com/lework/RedisDesktopManager-Windows/rel…

vulhub之fastjson篇-1.2.27-rce

一、启动环境 虚拟机:kali靶机:192.168.125.130/172.19.0.1(docker地址:172.19.0.2) 虚拟机:kali攻击机:192.168.125.130/172.19.0.1 本地MAC:172.XX.XX.XX 启动 fastjson 反序列化导致任意命令执行漏洞 环境 1.进入 vulhub 的 Fastjson 1.2.47 路径 cd /../../vulhub/fa…