Flutter非同步獲取網路資料
阿新 • • 發佈:2020-07-13
使用dio和futurebuilder,非同步獲取網路資料.在資料載入之前,頁面顯示載入圖示.
程式碼如下:
import 'package:flutter/material.dart'; import 'package:dio/dio.dart'; void main() => runApp(MyApp()); class MyApp 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 Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { Future<String> mockNetworkData() async { //請求url var url = 'http://xxx'; try { Response response = await Dio().get(url); //print(response); // print("------------"); // print(response.data.toString()); return response.data.toString(); } catch(e){ print(e); return '獲取資料失敗'; } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: FutureBuilder<String>( future: mockNetworkData(), builder: (BuildContext context, AsyncSnapshot snapshot) { // 請求已結束 if (snapshot.connectionState == ConnectionState.done) { if (snapshot.hasError) { // 請求失敗,顯示錯誤 return Text("Error: ${snapshot.error}"); } else { // 請求成功,顯示資料 return Text("Contents: ${snapshot.data}"); } } else { // 請求未結束,顯示loading return CircularProgressIndicator(); } }, ), ), ); } }
其中,FutureBuilder
會依賴一個Future
,它會根據所依賴的Future
的狀態來動態構建自身。
FutureBuilder
建構函式:
FutureBuilder({
this.future,
this.initialData,
@required this.builder,
})
-
future:FutureBuilder依賴的Future,通常是一個非同步耗時任務。
-
initialData:初始資料,使用者設定預設資料。
-
builder:Widget構建器;該構建器會在Future執行的不同階段被多次呼叫,構建器簽名如下:
Function (BuildContext context, AsyncSnapshot snapshot)
snapshot會包含當前非同步任務的狀態資訊及結果資訊 ,比如可以通過snapshot.connectionState獲取非同步任務的狀態資訊、通過snapshot.hasError判斷非同步任務是否有錯誤等等,完整的定義可以檢視AsyncSnapshot類定義。