Flutter StreamBuilder 在加载时删除旧数据

Sam*_*ari 5 dart flutter stream-builder

目前,我有一个 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(
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 5

听起来好像您直接在StreamBuilder流属性中获取数据:

StreamBuilder(
  stream: firebase.getData(),
  ...
)
Run Code Online (Sandbox Code Playgroud)

这样做的问题是每次setState调用它都会创建一个新的流并且总是给出一个初始null值。相反,您应该StatefulWidget在 期间使用 a 并在状态中创建一个变量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();
        }
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)