热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

谈谈Flutter中的请求和异步

如果你了解过JavaScript的线程模型,那么就会明白当你遇到有延迟的运算时(请求),它的运行过程都是异步的,只有这样你的Web应用UI才不会出现明显的卡顿。在现实的网络世界里,

如果你了解过 Javascript 的线程模型,那么就会明白当你遇到有延迟的运算时(请求),它的运行过程都是异步的,只有这样你的 Web 应用UI才不会出现明显的卡顿。在现实的网络世界里,多数情况下我们的业务都基于请求而展开的,Dart也是一个单线程的语言,因此在操作请求时它的运行过程也是异步,http://Dart.io 中封装了操作请求的类,你可以很便捷的使用它们。

让我们来看一个例子,请求 https://api.github.com/users/icepy,然后更新UI:

《谈谈 Flutter 中的请求和异步》
《谈谈 Flutter 中的请求和异步》

import 'dart:io';
var httpClient = new HttpClient();
...doing

这篇文章会用前端的视角来描述一下关于在 Flutter 中如何处理异步的问题。上述例子中,我写了两种方式来操作请求,并更新界面;如果你是前端那么一定了解 Promise 和 axios,Promise 是前端处理异步所有方案的基石。

const axios = require('axios');
axios.get('/user?ID=12345')
.then(function (response) {
// handle success console.log(response);
})
.catch(function (error) {
// handle error console.log(error);
})
.then(function () {
// always executed });

那么让我们来看一看 Dart 版的异步请求:

final githubURL = 'https://api.github.com/users/icepy';
var httpClient = new HttpClient();
String jsonStr = '';
httpClient.getUrl(Uri.parse(githubURL)).then((HttpClientRequest request){
return request.close();
}).then((HttpClientResponse response){
response.transform(utf8.decoder).listen((contents){
jsonStr += contents;
}).onDone(() {
// jsonStr });
});

是不是有一种和 Promise 非常类似的感觉?其实 getUrl 返回的是一个 Future,你可以把它理解为前端的 Promise。只不过在 Dart 的世界里 Future 是它来表示异步操作的的方式,事件循环线程队列真是一个很神奇的设计,我们又遇到了它。

那么,我们还有没有更直观的方案来处理异步操作?

对于前端的同学都非常了解 async 和 await 特性,在 Dart 的世界里也有 async 和 await,我们可以通过这些关键字的标记来处理异步请求。

Future<String> _getAsyncMyUserInfo() async {
final githubURL = 'https://api.github.com/users/icepy';
var httpClient = new HttpClient();
var request = await httpClient.getUrl(Uri.parse(githubURL));
var response = await request.close();
var body = await response.transform(utf8.decoder).join();
return body;
}

其实它返回的也是一个 Future,只不过对于 Dart 处理 async await 有它自己的定义,总结下来就是两条:

  • await 必须在 async 函数里执行
  • 要执行 async 函数必须用 await 关键字

在我们上述的 Widget 中我们没法把 builder 标记为 async ,这其实就比较纠结了,如果要从根上能运行 async 定义的函数或方法,我们还是需要借助 Future 来完成。

Future<Future<String>> dingFuture = new Future(_getAsyncMyUserInfo);
dingFuture.then((done){
done.then((contents){
var data = jsonDecode(contents);
_updateUI(data['login'], data['avatar_url']);
});
});

当然 async await 和 Future 的结合有很多种玩法,因此 Future 对于开发者来说是必须要掌握的一个特性,就像前端的同学必须掌握 Promise 一样,当你对它的原理足够理解,你就会明白,向 event queue 插入你的 event handler 是多么的重要,它将贯彻你开发 Flutter 应用的全部过程。

在我们真实的业务场景中多数情况下不会使用这么低级的API去处理请求,要么封装要么使用开源库,Dart Team 官方提供了一个 http package https://pub.dartlang.org/packages/http,来让我们更方便的开发业务。

import 'package:http/http.dart' as http;
var url = "http://example.com/whatsit/create";
http.post(url, body: {"name": "doodle", "color": "blue"})
.then((response) {
print("Response status: ${response.statusCode}");
print("Response body: ${response.body}");
});
http.read("http://example.com/foobar.txt").then(print);


推荐阅读
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 深入解析Android GPS机制:第五部分 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
author-avatar
手机用户2502887703
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有