推广

【Flutter 3-3】Flutter进阶教程——http请求和FutureBuilder

iseeyu2年前 (2024-02-22)推广157

2021_02_02_http_request_yaml

然后在要使用http库的文件里面引入头文件

import 'package:http/http.dart' as http;

发送http请求的代码也比较简单,我们这里以get请求为例

http.get("https://cdn.jsdelivr.net/gh/johnson8888/blog_pages/images/request_demo_test.json");

只要传入要请求的地址即可,这里的URL地址是我自己上传的测试文件。

http 异步请求返回结果

前面我知道http库发送请求是支持异步的,那么异步请求的返回结果我们该如何接收呢?

  • 通过then函数获取,在get请求之后我们可以直接跟上then函数来作为回调,在回调内部可以获取到请求的结果
http.get(getURL).then((value) {
  print(value);
});

这样写确实很方便,但当我们的网络请求很多,并且一个网络请求依赖另外一个网络请求的时候,这个时候就会多个回调函数嵌套在一起(又称为回调地狱),代码就会显得很凌乱,很不适合Debug。

  • 使用await来接收异步操作的结果
var data = await http.get(getURL);

这样写代码就比上面的代码清爽多了
但是需要注意的是,如果函数内部有被await修饰的方法,那么函数应该被async来修饰,并且返回值需要被Future修饰,Future是一个延时计算的对象,在被await修饰的函数返回的时候才能拿到Future的具体值。
示例入下:

Future<Map> getData() async {
  var data = await http.get(getURL);
  return data.body; 
}

刷新页面

我们前面已经知道:调用setState()函数可以刷新页面,所以在http请求之后我们调用setState()函数即可刷新页面

http.get(getURL).then((value) {
  print(value);
  var data = jsonDecode(data.body);
  setState(() {
    /// 此处执行刷新页面的代码
  });
});

使用FutureBuilder来刷新页面

setState()固然是可以刷新页面,但是当我们页面内有多个网络请求的时候,就会不停的调用setState()来全量刷新页面,显然这就有点冗余。
Flutter为我们提供了更好的方式来实现获取数据并且刷新UI的操作,那就是FutureBuilder
来看它的初始化方法

const FutureBuilder({
  /// key
  Key key,
  /// 异步的操作
  this.future,
  /// 初始化数据
  this.initialData,
  /// 构建UI的函数
  @required this.builder,
}) 

由构造函数可见,我们需要传入future参数,也就是我们的耗时操作函数,还需要传入builder函数
builder方法里可以捕捉到两个参数BuildContext contextAsyncSnapshot snap
其中snap的属性会携带future的耗时函数的返回值,也就是说:在耗时操作函数返回结果之后,我们可以在builder方法内获取到这一返回值。
所以上面的请求我们也可以这么来实现:

FutureBuilder(
  future: getData(),
  builder: (BuildContext context, AsyncSnapshot snap) {
    /// 如果没有数据 我们就显示loading页面
    if (snap.hasData == false) {
      return CircularProgressIndicator();
    } else {
    /// 如果获取到了数据 我们就初始化一个 ListView来展示获取到的数据
      var dataSource = snap.data["tracks"];
      return ListView.builder(
        itemCount: dataSource.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(dataSource[index]["title"]),
            subtitle: Text(dataSource[index]["cover"]),
          );
        },
      );
    }
  },
),

在获取到数据之后,我们通过ListView.builder来构建一个ListView并返回,此时就完成了刷新UI的工作

我这里写的比较简单,只是用hasData来做为判断的依据
其实还有更优雅的做法:使用snap的另一个属性connectionState

enum ConnectionState {
  /// 没有异步任务,
  none,
  /// 异步任务正在等待
  waiting,
  /// 异步任务正在执行 或者 数据正在传输
  active,
  /// 异步任务已经终止.
  done,
}

我们也可以在connectionStatedone的时候在来判断是否存在数据
如果存在就展示数据!

想体验以上的示例的运行效果,可以到我的Github仓库项目flutter_app->lib->routes->http_page.dart查看,并且可以下载下来运行并体验。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56116.html

相关文章

我来教你小编SEO关于电子商务网站SEO优化的几点建议。

我来教你小编SEO关于电子商务网站SEO优化的几点建议。

电子优化已经成为电商网络营销最重要的策略之一,一个整体优化状况不好的电子商务网站,供求信息不仅不能在搜索引擎检索到,甚至在网站内部分类目录、站内搜索、导航系统等都很难被潜在用户找到,那么如何在众多的电子商务网站中脱颖而出呢?需要做的很多,这里,就指出其中的注意事项。 电子商务网站首先就需...

CDP平台赋能精细化运营实践

CDP平台赋能精细化运营实践

编辑导语:如今,流量红利褪去,流量获取成本越来越昂贵,这篇文章通过介绍CDP平台的框架结构,分析了如何通过CDP平台服务于各个业务线的精细化运营需求。推荐想了解精细化运营的童鞋阅读。 一、 背景1. 行业背景互联网下半场,流量...

心理能量概述

一、弗洛伊德之于心理学1856年,正处于鼎盛时期的太平天国陷入了内乱,“天京事变”发生,东王杨秀清被杀。天平天国的内患还没被平灭,大清又面临着外患:英法联军挑起了第二次鸦片战争。而在万里之遥的一个地方,似乎发生了一件与此毫不相关的事——一个名叫弗洛伊德的犹太人男孩在奥匈帝国...

分析SEO优化的重要性和网站优化的方向。

分析SEO优化的重要性和网站优化的方向。

是一项非常重要的工作,当你看到这句话的时候,你觉得,百度重视SEO,那排名不会影响,以后的SEO工作会比较困难。我想我一定是想到了。当然,也收录我。外行是公认的SEO行业,容易,而且容易,哦,浮云。当然,你也可以从另一个角度来回答同样的问题。通过这样的友好提示,百度是否认可了SEO行业?在未来,SE...

如何做SEO站内优化?什么样的seo站内优化才能有好的seo效果。

如何做SEO站内优化?什么样的seo站内优化才能有好的seo效果。

因为网站内容是一个很好的推广和引流方式,很多都开始做这个工作,一些甲方公司也开始寻求相关的SEO服务,所以在这段时间里,我分享了一些关于内容引流的内容。 而本文也是一样,很发自内心,SEO还是想和大家分享一篇关于如何做SEO内容优化,如何让自己的内容更好的为自己的产品或品牌进行引流的文章...

一个网站从无到可以上线访问需要了解的事。

一个网站从无到可以上线访问需要了解的事。

一个网站由三部分组成:网站域名,网站空间,网站源文件 第一步,购买好域名和网站空间。然后域名和网站空间相互做解析,域名管理平台处绑定IP地址,网站空间里绑定域名。一般30分钟可以生效,解析完成。 第二步,配置网站空间环境(如果购买的是虚拟主机,可以跳过这步)。因为PHP网站最常见,这里我们就...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片