【发布时间】:2020-07-20 14:21:46
【问题描述】:
我使用 Cloud Firestore 作为后端,并使用提供程序包来管理我的应用程序的状态。我有一个 BooksProvider 类 (ChangeNotifierProvider),我用它来获取、添加、更新和删除数据。在这个类中,我有一个异步方法来从云存储中获取数据。
Future<void> fetchAndSetData() async {
try {
final response = await bookCollection.getDocuments();
List<Book> loadedBooks = [];
final querySnapshot = response.documents;
if (querySnapshot.isEmpty) {
return;
}
querySnapshot.forEach((book) {
loadedBooks.add(
Book(
id: book.documentID,
title: book.data['title'],
description: book.data['description'],
image: book.data['image'],
rate: book.data['rate'],
category: CategoryName.values[book.data['category_index']],
date: book.data['date'],
price: book.data['price'],
isFree: book.data['isFree'],
isFavorite: book.data['isFavorite']),
);
});
_booksList = loadedBooks;
notifyListeners();
} catch (e) {
throw e;
}
}
我正在尝试将它与未来的构建器一起使用,但它不起作用,因为它总是卡在 ConnectionState.waiting 案例中。
class BooksScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
// final booksData = Provider.of<BooksProvider>(context);
// final books = booksData.booksList;
// final _noContent = Center(child: Text('No books are available.'));
return FutureBuilder(
future: Provider.of<BooksProvider>(context).fetchAndSetData(),
builder: (ctx, dataSnapshot) {
switch (dataSnapshot.connectionState) {
case ConnectionState.waiting:
case ConnectionState.active:
return Text('waiting'); //always returning waiting
break;
case ConnectionState.done:
return Text('done');
break;
case ConnectionState.none:
return Text('none');
break;
default:
return Text('default');
}
},
);
}
}
我不知道可能出了什么问题,我尝试更改异步方法的返回类型,以便它返回 Book 列表,但它不起作用。我还使用了 if 语句而不是 switch case 并且同样的事情不断发生。
此外,我按照答案中的建议使用 if (dataSnapshot.hasdata) 进行了尝试,并且成功了!但是我想在等待时使用微调器,当我尝试时,发生了同样的问题再次。
我用另一种方法尝试了相同的方法,其中我使用有状态小部件和 didChangeDependencies() 方法来获取数据,它工作得很好,我正在尝试未来的构建器方法,因为我不知道如何处理 didChangeDependencies 错误() 方法。
因此,如果您可以帮助我处理未来的构建器或后一种方法的错误处理。提前谢谢你。
【问题讨论】:
-
你有没有异常,在catch块中添加打印语句并检查。
-
我没有收到任何错误或异常,当我打印 dataSnapshot 时,我会颤抖:AsyncSnapshot
(ConnectionState.waiting, data, null) 无限,正如我所说的方法工作正常使用其他方法,但返回类型可能是问题,因为我在 futurebuilder 中使用 void