在 iOS 中,在后台運行耗時任務時你會使用 UIProgressView
。
在 Flutter 中,使用一個 ProgressIndicator
widget。通過一個布爾 flag 來控制是否展示進度。在任務開始時,告訴 Flutter 更新狀態,並在結束后隱去。
在下面的例子中,build 函數被拆分成三個函數。如果 showLoadingDialog()
是 true
(當 widgets.length == 0
時),則渲染 ProgressIndicator
。否則,當數據從網絡請求中返回時,渲染 ListView
。
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Sample App', theme: ThemeData( primarySwatch: Colors.blue, ), home: SampleAppPage(), ); } } class SampleAppPage extends StatefulWidget { SampleAppPage({Key key}) : super(key: key); @override _SampleAppPageState createState() => _SampleAppPageState(); } class _SampleAppPageState extends State<SampleAppPage> { List widgets = []; @override void initState() { super.initState(); loadData(); } showLoadingDialog() { return widgets.length == 0; } getBody() { if (showLoadingDialog()) { return getProgressDialog(); } else { return getListView(); } } getProgressDialog() { return Center(child: CircularProgressIndicator()); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: getBody()); } ListView getListView() => ListView.builder( itemCount: widgets.length, itemBuilder: (BuildContext context, int position) { return getRow(position); }); Widget getRow(int i) { return Padding(padding: EdgeInsets.all(10.0), child: Text("Row ${widgets[i]["title"]}")); } loadData() async { String dataURL = "https://jsonplaceholder.typicode.com/posts"; http.Response response = await http.get(dataURL); setState(() { widgets = json.decode(response.body); }); } }
注意:
遇到問題看上一篇:
這里還是補充一下
首先在pubspec.yaml中添加https://www.cnblogs.com/wf-l5201314/p/10315922.html