如何在Flutter(REST API)中进行API调用

在本文中,我们将探讨如何在波动中进行API调用并使用简单的REST API。

在这里查看我在Flutter上的其他一些帖子:

  • Flutter vs React Native
  • 了解Flutter中的BLoC架构 (强烈建议)
  • 在Flutter中构建ListView(RecyclerView) (推荐)

我们将创建一个简单的应用程序,在其中我将对以下网址进行API调用: https : //jsonplaceholder.typicode.com/posts并在列表中打印出标题。

这将演示如何在flutter中进行API调用以及如何使用convert包解码json 。 所以,让我们开始吧。

首先,在Android Studio中创建一个新的flutter项目,并根据需要命名。

我将其命名为: flutter_api_calls

接下来,清除您获得的所有样板代码。 我们将从头开始编写所有内容。

接下来,我将设置项目的框架。 这意味着添加一个AppBar,一个脚手架并编写主要功能。

看起来像这样

 import 'package:flutter/material.dart' ;  void main() => runApp(MyApp());  MyApp class extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo' , theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Flutter Api Call' ), ); }  }  class MyHomePage extends StatefulWidget { MyHomePage({Key key, this .title}) : super (key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState();  }  class _MyHomePageState extends State<MyHomePage> {   @override Widget build(BuildContext context) { return null ; }    } 

首先,我们需要在pubspec.yaml文件中包含http包。 在依赖项下添加此行,其中该行显示了fld sdk。 这是您的pubspec.yaml的样子:

 name: flutter_api_calls  description: Flutter application to demonstrate api calls.  # The following defines the version and build number for your application.  # A version number is three numbers separated by dots, like 1.2 . 43  # followed by an optional build number separated by a +.  # Both the version and the builder number may be overridden in flutter  # build by specifying --build-name and --build-number, respectively.  # In Android, build-name is used as versionName while build-number used as versionCode.  # Read more about Android versioning at https: //developer.android.com/studio/publish/versioning  # In iOS, build-name is used as CFBundleShortVersionString build-number used as CFBundleVersion. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.  # Read more about iOS versioning at  # https: //developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html  version: 1.0 . 0 + 1  environment: sdk: ">=2.1.0 <3.0.0"  dependencies: flutter: sdk: flutter http: ^ 0.12 . 0 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^ 0.1 . 2  dev_dependencies: flutter_test: sdk: flutter 

现在,将http包导入到您的main.dart文件中:

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

让我们创建一个函数getData(),该函数将从API中获取数据。

 Future<String> getData() {  } 

我们将进行API调用,这可能需要一些时间才能返回响应。 这种情况需要异步编程。

基本上,我们需要等到api调用完成并返回结果。 这样做后,我们将立即显示列表。

所以,这就是我们要做的。 我们将使用http对象进行api调用,并等待其完成。

 Future<String> getData() async { var response = await http.get( Uri.encodeFull( " https://jsonplaceholder.typicode.com/posts " ), headers: { "Accept" : "application/json" }); setState(() { data = json.decode(response.body); }); return "Success" ;  } 

要在函数中使用await关键字,我们需要将函数标记为异步。 并且任何异步函数都具有Future <T>的返回类型,其中T可以为void,int,string等。

为了解码数据,我们使用:

 import 'dart:convert' ; 

它为我们提供了json.decode()方法,该方法可用于反序列化JSON 。 解码数据后,我们将通知视图层次结构该数据可用,并且可以将其填充到listview中。

这是代码的真实内容。 现在,我们需要向flutter应用程序添加一个列表视图

接下来,我们将在flutter应用程序中添加一个listview。 如果您不知道如何在flutter中创建列表视图,请快速阅读我的另一篇文章:

  • 阅读: 在Flutter中构建ListView(RecyclerView)

让我们创建一个函数getList(), 如果获取到数据 ,它将返回List; 如果响应尚未到达, 返回“ please wait”消息。

 Widget getList() { if (data == null || data.length < 1 ) { return Container( child: Center( child: Text( "Please wait..." ), ), ); } return ListView.separated( itemCount: data?.length, itemBuilder: (BuildContext context, int index) { return getListItem(index); }, separatorBuilder: (context, index) { return Divider(); }, );  } 

请注意,我们使用的是ListView.separated而不是普通的ListView.builder 。 原因是此列表视图已内置对分隔项的支持。 我们不需要显式检查索引。

为此构建列表项非常简单。 只需创建一个文本小部件并为其添加一些样式即可。

 Widget getListItem( int i) { if (data == null || data.length < 1 ) return null ; if (i == 0 ) { return Container( margin: EdgeInsets.all( 4 ), child: Center( child: Text( "Titles" , style: TextStyle( fontSize: 22 , fontWeight: FontWeight.bold, ), ), ), ); } return Container( child: Container( margin: EdgeInsets.all( 4.0 ), child: Padding( padding: EdgeInsets.all( 4 ), child: Text( data[i][ 'title' ].toString(), style: TextStyle(fontSize: 18 ), ), ), ), );  } 

您可以在github上找到完整的代码:https://github.com/Ayusch/flutter-api-calls

这是一个非常简单快捷的示例,说明如何开始在flutter中进行API调用。 尽管我建议为您的应用程序遵循适当的体系结构,但不要将所有代码都写在一个地方。

BLoC抖动架构非常强大。 在此处查看: Flutter中的BLoC体系结构 。 这将使您深入了解如何为Flutter应用程序编写健壮的BLoC架构

*重要* :加入面向移动开发人员的AndroidVille SLACK工作区,人们可以在此分享对最新技术的了解,尤其是在Android开发,RxJava,Kotlin,Flutter和一般的移动开发方面

翻译自: https://www.javacodegeeks.com/2019/09/how-to-make-an-api-call-in-flutter-rest-api.html

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

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

相关文章

sublime关闭左边文件路径快捷键

目录 背景 解决方法 方案一&#xff1a; 方案二&#xff1a; 背景 sublime查看某一文件具体内容&#xff0c;左边文件路径占用一部分空间&#xff0c;影响观看 解决方法 方案一&#xff1a; 使用快捷键&#xff1a;关闭和打开相同&#xff0c;先按 CtrlK&#xff0c;再按…

Typora全局搜素

目录 背景 解决方式 全局文件夹下搜索 方法一 方法二 单一文件下搜索 查找功能 1 查找整个单词 ​2 区分大小写 背景 有时需要在打开的文件夹中所有文件搜索某一单词&#xff0c;有时需要在一个文件下搜索 解决方式 全局文件夹下搜索 方法一 方法二 快捷键&#x…

linux 内存不足杀进程_内存不足:杀死进程或牺牲孩子

linux 内存不足杀进程现在是早上六点。 我清醒地总结了导致我太早唤醒电话的事件顺序。 这些故事开始时&#xff0c;我的电话警报响了。 困倦而脾气暴躁的我检查了电话&#xff0c;看我是否真的疯了以至于无法在凌晨5点设置唤醒警报。 不&#xff0c;这是我们的监视系统&#x…

为什么声明性编码使您成为更好的程序员

在许多情况下&#xff0c;具有功能组成的声明式解决方案提供了优于传统命令式代码的优越代码度量。 阅读本文并了解如何使用具有功能组成的声明性代码成为更好的程序员。 在本文中&#xff0c;我们将仔细研究三个问题示例&#xff0c;并研究用于解决这些问题的两种不同技术&am…

高效的企业测试-单元和用例测试(2/6)

在本系列的第一部分中&#xff0c;我们看到了有效测试应满足的一些普遍适用的原则和约束。 在这一部分中&#xff0c;我们将仔细研究代码级单元测试以及组件或用例测试。 单元测试 单元测试验证单个单元&#xff08;通常是类&#xff09;的行为&#xff0c;而忽略或模拟该单元…

搜狗输入法更换字体与皮肤

图标上右键-更多-属性设置 效果&#xff1a; 注意&#xff1a;如果是新安装的字体&#xff0c;更换中文字体但其中列表没有显示&#xff0c;可以取消更换字体前面的对钩后&#xff0c;重新选择对钩&#xff0c;此时就显示新的中文字体了

javafx 8u40_JavaFX 8u20天的未来过去(始终在最前面)

javafx 8u40自从我发布有关JavaFX的主题以来已经有很长时间了。 因此&#xff0c;如果您仍在追随&#xff0c;那就太棒了&#xff01; 介绍 在这篇博客文章中&#xff0c;我想写一篇关于从JavaFX 8 update 20开始的非常酷的功能的博客&#xff0c;该功能使您的应用程序始终位于…

如何在内存序列化中使用Java深克隆对象

在我以前的文章中&#xff0c;我解释了深度克隆和浅层克隆之间的区别 &#xff0c; 以及复制构造函数和防御性复制方法比默认的Java克隆更好。 使用复制构造函数和防御性复制方法进行的Java对象克隆当然具有某些优势&#xff0c;但是我们必须显式编写一些代码才能在所有这些方…

复制网页内容

问题背景&#xff1a; 当网页复制东西时&#xff0c;可能因为某些原因导致无法复制。可以用以下方法解决 解决方法&#xff1a; 1. 按下F12&#xff0c;出现以下内容 2. 依次点击右上角三个点&#xff0c;弹出界面后点击shortcuts 3. 选择首选项后&#xff0c;选中Disable …

插入时间信息

问题描述 在进行文本编辑的时候&#xff0c;往往需要记录当天日期。而Typora等软件没有及时插入时间的快捷方式。 方法 搜狗收入法提供快速记录时间的方式 1. 在中文输入法模式中输入rq&#xff08;汉语拼音日期的首字母&#xff09;&#xff0c;选项卡自动显示今日日期,可…

activemq网络桥接_ActiveMQ –经纪人网络解释–第4部分

activemq网络桥接在前面的第3部分中 &#xff0c;我们已经看到ActiveMQ如何帮助将远程使用者与本地使用者区分开来&#xff0c;这有助于确定从消息生产者到使用者的较短路径。 在第4部分中&#xff0c;我们将研究如何在远程代理上负载均衡并发使用者。 让我们考虑一些高级配置…

sublime 添加注释模块

问题背景&#xff1a; 规范的程序需要对函数进行注释&#xff0c;常用的开发工具如IDEA、VS Code都对注释模板有很好的支持。本博客介绍Sublime下支持模块注释功能的设置。 一 安装 一、安装方法 1.安装docblocker插件 mac CmdShiftP -> Install Package -> docblock…

只读副本和Spring Data第3部分:配置两个实体管理器

我们之前的设置可以正常工作。 我们现在要做的是进一步发展&#xff0c;并配置两个单独的实体管理器&#xff0c;而不会影响我们之前实现的功能。 第一步是将默认的实体管理器配置设置为主要配置。 这是第一步 package com.gkatzioura.springdatareadreplica.config; import…

Win+E快速打开我的电脑方式设置方式

W10运用快捷键WinE快速打开我的电脑设置方式

JMetro版本11.6.5和8.6.5发布

再一次问好。 设置了SDK中所有JavaFX控件的样式以及其他一些不存在的样式以及其他库中的其他样式。 后续版本将涉及调整JMetro现有样式或从第三方库的其他控件添加其他样式。 此版本就是这种情况。 这是新功能&#xff1a; 3种新的控件样式&#xff1b; 调整JMetro现有样式&a…

Chrome浏览器的便捷使用方式

截取转载于B站视频【全套教程】高效玩转Chrome浏览器&#xff0c;丰富你的上网体验_哔哩哔哩_bilibili中的脑图文件&#xff0c;便于之后的熟悉使用。 脑图链接 https://naotu.baidu.com/file/5a5332eee10dd903cc084d49189cd2behttps://naotu.baidu.com/file/5a5332eee10dd90…

Sublime查看已经安装的插件

蓝色框图内显示已经安装的插件

activemq网络桥接_ActiveMQ –经纪人网络解释–第3部分

activemq网络桥接现在&#xff0c;我们已经在本博客系列的第1部分和第2 部分中了解了ActiveMQ网络连接器的基础&#xff0c;在第3部分中&#xff0c;我们将研究ActiveMQ如何平衡连接到代理网络的使用者。 介绍 当可以无序处理队列中的消息时通常使用并发使用者&#xff0c;通常…

Word样式的导入与导出

1 样式的介绍 样式&#xff0c;也就是Word中各级标题的格式。合理的设置样式模板&#xff0c;可以帮助更方便的进行文本编辑。 2 样式的导入 具体情形为将“文档标准模板.dotm”的内容应用于“新建Microsoft Word文档”。 按照图示进行操作 【 如果应用模板为文件内的样式…

word将一个文档的样式导入到另一个文档

一、背景 在word中编辑文档时&#xff0c;经常需要定义一个样式给特定格式的文本使用&#xff0c;如标题1&#xff0c;标题2等&#xff0c;而有时需要在一个新文档A中使用一个旧文档B中定义好的样式。 二、操作步骤 1、打开旧文档B&#xff0c;选择上方标签栏的"样式&quo…