我不确定如何处理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
来确保您已获取数据并终止了异步连接。
要了解如何处理StreamBuilder
和QuerySnapshot
,请查看Firebase for Flutter