snapshot.ConnectionState始终在使用提供程序包的FutureBuilder中等待

时间:2020-07-20 14:21:46

标签: flutter provider

我将Cloud Firestore用作后端以及用于我的应用程序状态管理的提供程序包。我有一个BooksProvider类(ChangeNotifierProvider),可用于获取,添加,更新和删除数据。在此类中,我有一个异步方法从Cloud Firestore中获取数据。

 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大小写,并且同一件事不断发生。

此外,我尝试了if(dataSnapshot.hasdata),如答案中的建议那样,它起作用了!但是我想在等待时使用微调器,当我尝试它时,发生了同样的问题再次。

我尝试了与另一种方法相同的方法,在这种方法中,我使用有状态的小部件和didChangeDependencies()方法来获取数据,并且工作得很好,我正在尝试将来的构建器方法,因为我不知道如何使用didChangeDependencies处理错误()方法。

因此,如果您可以在以后的构建器或后一种方法的错误处理方面为我提供帮助。预先谢谢你。

1 个答案:

答案 0 :(得分:0)

使用dataSnapshot.hasData代替dataSnapshot.connectionState