目前,我有一个StreamBuilder,它从Firebase中为组消息传递应用程序提取数据。我有一个snapshot.hasData检查,以确保在显示消息之前有数据。问题在于,当setState重建小部件时,它还会重建StreamBuilder,从而使其显示静态快照。hasData == false内容,然后再次完成数据加载。这看起来真的很糟糕,因为它加载得如此之快,以至于每次重建时屏幕都闪烁一秒钟。
在重新加载数据时如何保留数据,以使其看起来不闪烁?
有没有一种方法可以防止StreamBuilder在特定情况下重建?
谢谢!
编辑添加的当前代码。
var firebaseStream;
@override
void initState() {
super.initState();
firebaseStream = Firestore.instance
.collection('groups')
.document(groupID)
.collection('messages')
.orderBy('date', descending: true)
.limit(15)
.snapshots();
StreamBuilder(
stream: firebaseStream,
builder: (context, snapshot) {
if (!snapshot.hasData)
return Container(
color: Colors.red,);
return ListView.builder(
最佳答案
听起来好像您是直接在StreamBuilder
流属性中获取数据:
StreamBuilder(
stream: firebase.getData(),
...
)
这样做的问题是,每次调用setState
时都会创建一个新流,并始终提供一个初始null
值。相反,您应该使用StatefulWidget
并在initState
期间以您的状态创建一个变量,这样它只能运行一次。然后将此变量用作StreamBuilder
中的流属性。这是一个非常简单的示例:class Example extends StatefulWidget {
Example({Key key}) : super(key: key);
@override
_ExampleState createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
Stream firebaseData;
@override
void initState() {
super.initState();
firebaseData = Firebase.fetchData(); //Or whatever function you use
}
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: firebaseData,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data);
} else {
return Loading();
}
},
);
}
}