flutter中的网络请求数据获取详解

 更新时间:2023年01月11日 10:11:02   作者:前端那些年  
这篇文章主要为大家介绍了flutter中的网络请求数据获取示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

跨平台的http请求

http包提供了最简单的发起请求的方式,并且这个包在WEB,ANDROID,IOS上都得到了很好的支持。

需要注意的是,在某些特定的平台上需要设置一些额外的内容,比如:

ANDROID上必须在manifest(AndroidManifest.xml)文件中进行声明。

<manifest xmlns:android...>
 ...
 <uses-permission android:name="android.permission.INTERNET" />
 <application ...
</manifest>

macOS上必须在.entitlements进行配置。

<key>com.apple.security.network.client</key>
<true/>

请求数据

从网络上请求数据大致分为四步:

  • 添加http
  • 通过http包发起请求
  • 将收到的响应数据转为客户端可用的数据
  • 展示用户界面

添加http包

我们只需要在pub.dev文件中添加配置即可:

dependencies:
  http: <latest_version>

然后在代码中导入http包:

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

另外,在安卓中我们需要添加网络权限:

<!-- Required to fetch data from the internet. -->
<uses-permission android:name="android.permission.INTERNET" />

发起请求

发起请求很简单:

Future<http.Response> fetchAlbum() {
  return http.get(Uri.parse('https://jsonplaceholder.typicode.com/albums/1'));
}

http.get()方法返回一个Future类的数据,这个数据包含了收到的响应数据。 Future是用于处理异步操作的核心Dart类。Future对象表示将来某个时间可能出现的值或错误。 http.Response类包含从成功的http调用接收的数据。

将响应转为常用对象

虽然发出网络请求很容易,但使用原始的Future<http.Response>并不是很方便。为了让我们的开发更简单,我们可以将http.Response转换为Dart对象。

首先,创建一个包含网络请求数据的Album类。它包括一个工厂构造函数,用于从JSON创建Album。

class Album {
  final int userId;
  final int id;
  final String title;
  const Album({
    required this.userId,
    required this.id,
    required this.title,
  });
  factory Album.fromJson(Map<String, dynamic> json) {
    return Album(
      userId: json['userId'],
      id: json['id'],
      title: json['title'],
    );
  }
}

然后,我们使用以下步骤更新fetchAlbum()函数以返回Future<Album>

  • 使用dart:Convert包将响应体转换为JSON映射。
  • 如果服务器确实返回了状态代码为200的OK响应,则使用fromJson()工厂方法将JSON映射转换为Album
  • 如果服务器没有返回状态代码为200的OK响应,则抛出异常。(即使在“404 Not Found”服务器响应的情况下,也会抛出异常。不要返回null。这在检查快照中的数据时很重要,如下所示。)
Future<Album> fetchAlbum() async {
  final response = await http
      .get(Uri.parse('https://jsonplaceholder.typicode.com/albums/1'));
  if (response.statusCode == 200) {
    // If the server did return a 200 OK response,
    // then parse the JSON.
    return Album.fromJson(jsonDecode(response.body));
  } else {
    // If the server did not return a 200 OK response,
    // then throw an exception.
    throw Exception('Failed to load album');
  }
}

获取数据

我们可以在initState()didChangeDependencies()方法中调用fetchAlbum()方法。

initState()方法只调用一次,然后再也不会调用。如果我们想选择重新加载API以响应InheritedWidget的更改,我们可以将调用放入didChangeDependencies()方法中。

class _MyAppState extends State<MyApp> {
  late Future<Album> futureAlbum;
  @override
  void initState() {
    super.initState();
    futureAlbum = fetchAlbum();
  }
  // ···
}

展示数据

要在屏幕上显示数据,我们可以使用FutureBuilder组件。FutureBuilder组件随Flutter一起提供,可以轻松处理异步数据源。

我们需要提供两个参数:

  • 具体的Future
  • builder方法,用来告诉系统渲染什么内容,根据状态可以选择加载中等等。
FutureBuilder<Album>(
  future: futureAlbum,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text(snapshot.data!.title);
    } else if (snapshot.hasError) {
      return Text('${snapshot.error}');
    }
    // By default, show a loading spinner.
    return const CircularProgressIndicator();
  },
)

为什么要在initstate中获取数据?

虽然在build()中调用很方便,但不建议将API调用放在build()方法中。

Flutter每次需要更改视图中的任何内容时都会调用build()方法,这种情况经常发生。如果将fetchAlbum()方法放置在build()中,则会在每次重建时重复调用,导致应用程序速度减慢。

以上就是flutter中的网络请求数据获取详解的详细内容,更多关于flutter网络请求数据获取的资料请关注脚本之家其它相关文章!

相关文章

  • Android Studio调试Gradle插件详情

    Android Studio调试Gradle插件详情

    这篇文章主要介绍了Android Studio调试Gradle插件详情,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Android设计模式之单例模式解析

    Android设计模式之单例模式解析

    这篇文章主要为大家详细介绍了Android设计模式之单例模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Android自定义View之绘制圆形头像功能

    Android自定义View之绘制圆形头像功能

    这篇文章主要介绍了Android自定义View之绘制圆形头像功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Android开发中判断手机是否安装了QQ或者微信

    Android开发中判断手机是否安装了QQ或者微信

    这篇文章主要介绍了Android开发中判断手机是否安装了QQ或者微信的相关资料,需要的朋友可以参考下
    2017-01-01
  • android仿音悦台页面交互效果实例代码

    android仿音悦台页面交互效果实例代码

    这篇文章主要介绍了android 仿音悦台页面播放效果实例代码,新版的音悦台 APP 播放页面交互非常有意思,可以把播放器往下拖动,然后在底部悬浮一个小框,还可以左右拖动。
    2017-01-01
  • Android变形(Transform)之Matrix用法

    Android变形(Transform)之Matrix用法

    Android的2D变形(包括缩放,扭曲,平移,旋转等)可以通过Matrix来实现,本文研究了一下;接下来就将我这俩天研究的东西和大家分享下,先来看看Matrix的用法感兴趣的你可不要错过了哈
    2013-02-02
  • Flutter学习教程之Route跳转以及数据传递

    Flutter学习教程之Route跳转以及数据传递

    这篇文章主要给大家介绍了关于Flutter学习教程之Route跳转以及数据传递的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • AndroidStudio中AVD虚拟机设备空间不足调试过程出现的黑屏问题及解决方案

    AndroidStudio中AVD虚拟机设备空间不足调试过程出现的黑屏问题及解决方案

    这篇文章主要介绍了解决AndroidStudio中AVD虚拟机设备空间不足调试过程出现的黑屏问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Android 动态改变布局实例详解

    Android 动态改变布局实例详解

    这篇文章主要介绍了Android 动态改变布局实例详解的相关资料,这里举例说明如何实现动态改变布局的例子,帮助大家学习理解,需要的朋友可以参考下
    2016-11-11
  • Android中使用itemdecoration实现时间线效果

    Android中使用itemdecoration实现时间线效果

    这篇文章主要介绍了Android中使用itemdecoration实现时间线效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02

最新评论