【问题标题】:snapshot.ConnectionState is always waiting in the FutureBuilder using provider packagesnapshot.ConnectionState 始终使用提供程序包在 FutureBuilder 中等待
【发布时间】: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

标签: flutter provider


【解决方案1】:

使用dataSnapshot.hasData 而不是dataSnapshot.connectionState

【讨论】:

  • 谢谢!它有效,但如果我想在等待数据时使用 CircularProgressIndicator() 怎么办?
  • 如果 dataSnapshot.hasData 为 false,则可以显示循环进度指示器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2014-05-26
  • 1970-01-01
  • 2021-11-16
  • 2021-02-25
  • 2019-10-14
相关资源
最近更新 更多