gpt4 book ai didi

Flutter StreamBuilder 加载时移除旧数据

转载 作者:行者123 更新时间:2023-12-03 03:14:25 30 4
gpt4 key购买 nike

目前,我有一个 StreamBuilder 从 Firebase 为群消息应用程序提取数据。我有一个 snapshot.hasData 检查以确保在显示消息之前有数据。问题在于,当 setState 重建小部件时,它也会重建 StreamBuilder,导致它在再次完成加载数据之前显示静态 snapshot.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值(value)。相反,您应该使用 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();
}
},
);
}
}

关于Flutter StreamBuilder 加载时移除旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63006297/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com