推广

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

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

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://0291.com.cn/post/56116.html

相关文章

【抖音小店详解】关于抖音小店最详细的解析,

【抖音小店详解】关于抖音小店最详细的解析,

大家好,我是阿亮,513传媒的创始人之一 目前深耕抖音带货、抖音IP打造、抖音商业变现等。 今天要分享的是抖音小店纯干货,从抖音小店怎么开通,到抖音小店各种坑怎么规避,都会毫无保留的分享出来,如果你正准备在抖音里面开小店,一定要收藏这篇文章哦。 抖音热门套餐 如果你是商家或者说你自己有产...

产品竞争市场与产品周期决定营销策略方案的成功与否。

产品竞争市场与产品周期决定营销策略方案的成功与否。

如果我们想做自己的事。如果我们的产品处于先进地位,那么我们必须一个接一个地匹配产品竞争市场、产品周期和。产品生命周期理论将产品划分为不同的生命阶段,营销者可以根据不同阶段的特点,采取有针对性的营销策略和方法。产品生命周期也是营销人员描述产品和市场运作方法的有力工具。产品生命周期是制定营销目标和营销策...

霸屏营销推广? 做网络推广如何找客户合作?

义乌全网霸屏构建者李国凯说网络可以通过以下几种方式进行: 搜索引擎霸屏:通过搜索引擎的关键词广告、网站优化等手段,将企业网站或推到搜索引擎的前列,实现霸屏效果。 关键词霸屏:通过在各大搜索引擎和社交媒体上发布与企业品牌或产品相关的内容,提...

引爆内容的可读性、受益性应该把握大众的情感点。

引爆内容的可读性、受益性应该把握大众的情感点。

对于脑力劳动者来说,这一水平取决于他们掌握了多少套路。在媒体爆炸的时代,随着算法的改进,没有随机的成功文章和主题,其背后的策略和方法需要我们不断学习和总结。自从媒体时代以来,总有一些内容可以一夜之间流行起来,而这些爆炸性内容背后的巨大利益总是吸引着经营者的眼球,因此他们模仿和改进爆炸性内容。虽然爆...

书店老板教我通过私域运营月入十万!

书店老板教我通过私域运营月入十万!

这年头,开书店还能赚钱? 任何一个追逐快速利润的老板,都不会在这个追求快节奏的时代,去开一家书店,在投资人眼中,这也绝对不是一个好的“生意”。 但是,今天分享一个微信私域运营的案例: 看看这家书店老板如何教我通过微信私域运营,月入十万! 一、背景 因为喜欢周末闲暇的时候看书,笔者...

分享网站排名上升的小技巧。

分享网站排名上升的小技巧。

搜索引擎优化(SEO)是近年来兴起的一种特殊的网络营销方式这种营销方式就是提高曝光率,让搜索引擎关键词能够站在前面,从而达到的目的,因为这种优化方法的价格不是很贵,所以很多站长都喜欢SEO,主要是通过各种搜索引擎来优化自己的网页,从而达到宣传的目的,从而提高网站的排名,进而提高访问量和销售量。...

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

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