網站首頁 編程語言 正文
跨平臺的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()
中,則會在每次重建時重復調用,導致應用程序速度減慢。
原文鏈接:https://juejin.cn/post/7186976318595006524
相關推薦
- 2022-09-07 Golang使用CGO與Plugin技術運行加載C動態庫_Golang
- 2022-05-11 continue,return,break的區別
- 2022-07-08 C#使用WebClient實現上傳下載_C#教程
- 2022-08-05 C語言超詳細講解宏與指針的使用_C 語言
- 2022-06-12 C#泛型接口的協變和逆變_C#教程
- 2022-09-04 C/C++?引用作為函數的返回值方式_C 語言
- 2022-01-10 微信小程序報錯 Cannot read property ‘forceUpdate‘ of u
- 2023-03-29 python中文字符如何轉url編碼_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支