我的设备没有互联网连接时,我试图捕获该错误。我建立了2种将来的方法,一种是导入json,另一种是查看数据库。我有一个Future构建器,该构建器假定在构建网格视图之前要等待两个Future完成,但是由于连接错误,似乎offlineFlashCardList被过早调用。知道如何在调用快照错误之前使其等待两个期货完成吗?
import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; import 'package:baby_sound/strings.dart'; import 'package:baby_sound/objects/flashCardList.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'dart:async' show Future; import 'dart:convert'; import 'package:baby_sound/database/database.dart'; import 'package:baby_sound/objects/network.dart'; import 'package:http/http.dart' as http; class GridViewWidget extends StatefulWidget{ @override createState() => new GridViewState(); } class GridViewState extends State<GridViewWidget>{ List<FlashCardList> flashCardList; List<FlashCardList> offlineFlashCardList; Future<List<FlashCardList>> fetchFlashCardList() async{ debugPrint("before response"); List<FlashCardList> tempFlashCardList; final response = await http.get('some json url'); //checkConnection(url).then((response){ debugPrint ("after database load, response code: ${response.statusCode}"); if (response.statusCode == 200) { var data = json.decode(response.body); var flashCardListData = data["FlashCardList"] as List; tempFlashCardList = flashCardListData.map<FlashCardList>((json) => FlashCardList.fromJson(json)).toList(); for (int i = 0; i < tempFlashCardList.length; i++){ debugPrint("DBProvider listID: ${await DBProvider.db.getFlashCardList(tempFlashCardList[i].flashCardListID)}, flashCardID: ${tempFlashCardList[i].flashCardListID}"); if (await DBProvider.db.getFlashCardList(tempFlashCardList[i].flashCardListID) == null){ DBProvider.db.newFlashCardList(tempFlashCardList[i]); debugPrint("Adding ${tempFlashCardList[i].name}}}"); } else { DBProvider.db.updateFlashCardList(tempFlashCardList[i]); debugPrint("Updating ${tempFlashCardList[i].name}, getFlashCardList: ${DBProvider.db.getFlashCardList(tempFlashCardList[i].flashCardListID)}"); } } flashCardList = tempFlashCardList; debugPrint("Standard flashCardList Size: ${flashCardList.length}"); } debugPrint("flashCardList Size Before Return: ${flashCardList.length}"); return flashCardList; } Future<List<FlashCardList>> fetchFlashCardListFromDB() async{ offlineFlashCardList = await DBProvider.db.getAllFlashCardListFromDB(); debugPrint("fetchFromDB size: ${offlineFlashCardList.length}"); return offlineFlashCardList; } @override void initState(){ debugPrint ('debug main.dart'); super.initState(); } @override Widget build(BuildContext context){ return new Scaffold( appBar: new AppBar( centerTitle: true, title: new Text(Strings.pageTitle), ), body: FutureBuilder<List<FlashCardList>>( future: new Future(() async{ await fetchFlashCardList(); await fetchFlashCardListFromDB(); }), builder: (BuildContext context, AsyncSnapshot<List<FlashCardList>> snapshot) { if (snapshot.connectionState == ConnectionState.done) { if (snapshot.hasError) { debugPrint("Snapshot has error: ${snapshot.error}"); return new GridView.builder( gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 200.0, childAspectRatio: 0.5), itemCount: offlineFlashCardList.length, itemBuilder: (BuildContext context, int index) { return _getGridItemUI(context, offlineFlashCardList[index]); }); // return new Center(child: new CircularProgressIndicator()); } else { debugPrint("Grid ViewBuilder"); return new GridView.builder( gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 200.0, childAspectRatio:0.5), itemCount: flashCardList.length, itemBuilder: (BuildContext context, int index) { return _getGridItemUI(context, flashCardList[index]); }); } }else { debugPrint("CircularProgress"); return new Center(child: new CircularProgressIndicator()); } }) ); } _getGridItemUI(BuildContext context, FlashCardList item){ return new InkWell( onTap: () { _showSnackBar(context, item); }, child: new Card( child: new Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ new Image(image: new CachedNetworkImageProvider("https://babymozart.org/babymozartq92C9TLa9UMkulL2m81xHdn9u2R92e1e/image/" + item.image)), /*new Expanded( child:new Center( child: new Column( children: <Widget>[ new SizedBox(height: 8.0), new Expanded( child: AutoSizeText( item.name, maxLines: 1, ) ) ], ), ) )*/ ], ), elevation: 2.0, margin: EdgeInsets.all(5.0), ) ); } _showSnackBar(BuildContext context, FlashCardList item){ } }
您可以使用Future.wait等待多个Future完成。
body: FutureBuilder<List<FlashCardList>>( future: Future.wait([ fetchFlashCardList(), fetchFlashCardListFromDB(), ]),