我不确定如何处理Flutter StreamBuilder。我发现了3种情况,并且想知道无论哪种原因,哪一种都会比其他的更好。或者,除了这些情况之外,还有其他更好的方法来处理它。

另外, ConnectionState.active ConnectionState.done 有什么区别?我是否应该使用 snapshot.data 直到 ConnectionState.done到为止(情况1 情况2 )。

情况1:

    return StreamBuilder(
      builder: (context, snapshot) {
        if (snapshot.hasError) return Text('Error');
        switch (snapshot.connectionState) {
          case ConnectionState.none:
          case ConnectionState.waiting:
            return CircularProgressIndicator();
          case ConnectionState.active:
          case ConnectionState.done:
            return Text('${snapshot.data}');
        }
        return null;
      },
    );

情况2:
    return StreamBuilder(
      builder: (context, snapshot) {
        if (snapshot.hasError) return Text('Error');
        switch (snapshot.connectionState) {
          case ConnectionState.none:
          case ConnectionState.waiting:
          case ConnectionState.active:
            return CircularProgressIndicator();
          case ConnectionState.done:
            return Text('${snapshot.data}');
        }
        return null;
      },
    );

情况3:
    return StreamBuilder(
      builder: (context, snapshot) {
        if (snapshot.hasError) return Text('Error');
        if (!snapshot.hasData) return CircularProgressIndicator();
        return Text('${snapshot.data}');
      },
    );

最佳答案

根据Flutter Docs,它声明了active和done之间的区别在于 ConnectionState.active :是尚未完成但返回至少一个值的Stream,
ConnectionState.done :它终止了您正在处理的异步计算/事务。

关于何时应该等待的问题,这取决于您正在执行的计算类型。

通常,ConnectionState.active更为重要,因为您正在处理流,这意味着可以更新数据,并且应用程序的状态也应更新。

您可以使用ConnectionState.done来确保您已获取数据并终止了异步连接。

要了解如何处理StreamBuilderQuerySnapshot,请查看Firebase for Flutter

08-05 11:15