flutter中的網(wǎng)絡(luò)請求數(shù)據(jù)獲取詳解
跨平臺的http請求
http
包提供了最簡單的發(fā)起請求的方式,并且這個包在WEB
,ANDROID
,IOS
上都得到了很好的支持。
需要注意的是,在某些特定的平臺上需要設(shè)置一些額外的內(nèi)容,比如:
在ANDROID
上必須在manifest(AndroidManifest.xml
)文件中進(jìn)行聲明。
<manifest xmlns:android...> ... <uses-permission android:name="android.permission.INTERNET" /> <application ... </manifest>
macOS上必須在.entitlements
進(jìn)行配置。
<key>com.apple.security.network.client</key> <true/>
請求數(shù)據(jù)
從網(wǎng)絡(luò)上請求數(shù)據(jù)大致分為四步:
- 添加
http
包 - 通過
http
包發(fā)起請求 - 將收到的響應(yīng)數(shù)據(jù)轉(zhuǎn)為客戶端可用的數(shù)據(jù)
- 展示用戶界面
添加http包
我們只需要在pub.dev
文件中添加配置即可:
dependencies: http: <latest_version>
然后在代碼中導(dǎo)入http
包:
import 'package:http/http.dart' as http;
另外,在安卓中我們需要添加網(wǎng)絡(luò)權(quán)限:
<!-- Required to fetch data from the internet. --> <uses-permission android:name="android.permission.INTERNET" />
發(fā)起請求
發(fā)起請求很簡單:
Future<http.Response> fetchAlbum() { return http.get(Uri.parse('https://jsonplaceholder.typicode.com/albums/1')); }
http.get()
方法返回一個Future
類的數(shù)據(jù),這個數(shù)據(jù)包含了收到的響應(yīng)數(shù)據(jù)。 Future
是用于處理異步操作的核心Dart類。Future
對象表示將來某個時間可能出現(xiàn)的值或錯誤。 http.Response
類包含從成功的http調(diào)用接收的數(shù)據(jù)。
將響應(yīng)轉(zhuǎn)為常用對象
雖然發(fā)出網(wǎng)絡(luò)請求很容易,但使用原始的Future<http.Response>
并不是很方便。為了讓我們的開發(fā)更簡單,我們可以將http.Response
轉(zhuǎn)換為Dart對象。
首先,創(chuàng)建一個包含網(wǎng)絡(luò)請求數(shù)據(jù)的Album
類。它包括一個工廠構(gòu)造函數(shù),用于從JSON創(chuàng)建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()
函數(shù)以返回Future<Album>
:
- 使用
dart:Convert
包將響應(yīng)體轉(zhuǎn)換為JSON映射。 - 如果服務(wù)器確實返回了狀態(tài)代碼為
200
的OK響應(yīng),則使用fromJson()
工廠方法將JSON映射轉(zhuǎn)換為Album
。 - 如果服務(wù)器沒有返回狀態(tài)代碼為200的OK響應(yīng),則拋出異常。(即使在“404 Not Found”服務(wù)器響應(yīng)的情況下,也會拋出異常。不要返回null。這在檢查快照中的數(shù)據(jù)時很重要,如下所示。)
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'); } }
獲取數(shù)據(jù)
我們可以在initState()
或didChangeDependencies()
方法中調(diào)用fetchAlbum()
方法。
initState()
方法只調(diào)用一次,然后再也不會調(diào)用。如果我們想選擇重新加載API以響應(yīng)InheritedWidget
的更改,我們可以將調(diào)用放入didChangeDependencies()
方法中。
class _MyAppState extends State<MyApp> { late Future<Album> futureAlbum; @override void initState() { super.initState(); futureAlbum = fetchAlbum(); } // ··· }
展示數(shù)據(jù)
要在屏幕上顯示數(shù)據(jù),我們可以使用FutureBuilder
組件。FutureBuilder
組件隨Flutter一起提供,可以輕松處理異步數(shù)據(jù)源。
我們需要提供兩個參數(shù):
- 具體的Future
- builder方法,用來告訴系統(tǒng)渲染什么內(nèi)容,根據(jù)狀態(tài)可以選擇
加載中
等等。
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中獲取數(shù)據(jù)?
雖然在build()中調(diào)用很方便,但不建議將API調(diào)用放在build()方法中。
Flutter每次需要更改視圖中的任何內(nèi)容時都會調(diào)用build()
方法,這種情況經(jīng)常發(fā)生。如果將fetchAlbum()
方法放置在build()
中,則會在每次重建時重復(fù)調(diào)用,導(dǎo)致應(yīng)用程序速度減慢。
以上就是flutter中的網(wǎng)絡(luò)請求數(shù)據(jù)獲取詳解的詳細(xì)內(nèi)容,更多關(guān)于flutter網(wǎng)絡(luò)請求數(shù)據(jù)獲取的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 四種動畫效果的調(diào)用實現(xiàn)代碼
在這里, 我將每種動畫分別應(yīng)用于四個按鈕為例,需要的朋友可以參考下2013-01-01Android 模仿iPhone列表數(shù)據(jù)View刷新動畫詳解
本文主要介紹Android 模仿iPhone列表數(shù)據(jù)view 刷新動畫的資料,這里整理詳細(xì)的資料,并附示例代碼及實現(xiàn)效果圖,有興趣的小伙伴可以參考下2016-09-09Android開發(fā)框架之自定義ZXing二維碼掃描界面并解決取景框拉伸問題
這篇文章主要介紹了Android開發(fā)框架之自定義ZXing二維碼掃描界面并解決取景框拉伸問題的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06Android中使用Canvas繪制南丁格爾玫瑰圖(Nightingale rose diagram)
這篇文章主要介紹了Android中使用Canvas繪制南丁格爾玫瑰圖(Nightingale rose diagram),本文直接給出實現(xiàn)代碼和運行效果圖,需要的朋友可以參考下2015-03-03Android PopupWindow 點擊外面取消實現(xiàn)代碼
這篇文章主要介紹了Android PopupWindow 點擊外面取消實現(xiàn)代碼,本文直接給出核心實現(xiàn)代碼,代碼中包含注釋,需要的朋友可以參考下2015-04-04Android自定義Adapter的ListView的思路及代碼
Android自定義Adapter的ListView的思路及代碼,需要的朋友可以參考一下2013-05-05Android開發(fā)中WebView的簡單使用小結(jié)
WebView(網(wǎng)絡(luò)視圖)能加載顯示網(wǎng)頁,可以將其視為一個瀏覽器。它使用了WebKit渲染引擎加載顯示網(wǎng)頁。下面這篇文章給大家總結(jié)了Android中WebView的簡單使用,有需要的可以參考借鑒。2016-09-09