目前,我有一个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();
        }
      },
    );
  }
}

10-06 08:01
查看更多