0

当我重建一个小部件时,它是另一个包含StreamBuilder类的小部件的祖先,最后一个小部件将永远加载。我贴一个简单的例子:这个构建方法是Ancestor 小部件,一个stateful小部件。该_buildForm方法包含带有StreamBuilder.

      @override
  Widget build(BuildContext context) {
    if (_isSaving) {
      return FutureBuilder<void>(
          future: _saveData(),
          builder: (context, snapshot) {
            switch (snapshot.connectionState) {
              case ConnectionState.waiting:
                return Center(child: CircularProgressIndicator());
              default:
                _isSaving = false;
                if (snapshot.hasError) {
                  Future.delayed(Duration.zero, () async {
                    ScaffoldMessenger.of(context).showSnackBar(
                        _notice("error: ${snapshot.error.toString()}"));
                  });
                } else {
                  Future.delayed(Duration.zero, () async {
                    ScaffoldMessenger.of(context).showSnackBar(
                        _notice("OK!"));
                  });
                }
                return _buildForm(context);
            }
          });
    } else {
      return _buildForm(context);
    }
  }
}

这是后代小部件,一个stateful小部件,带有StreamBuilder小部件:

final Stream<List<ProductType>> _streamProductTypes = (() async* {
    await for (var e in EntityControllers.productTypeController.readStream()) {
      yield e.cast<ProductType>();
    }
  })();

         StreamBuilder<List<ProductType>>(
                stream: _streamProductTypes,
                builder: (BuildContext context,
                    AsyncSnapshot<List<ProductType>> snapshot) {
                  switch (snapshot.connectionState) {
                    case ConnectionState.waiting:
                      return Center(child: CircularProgressIndicator());
                    default:
                      if (snapshot.hasError) {
                        return Text("${snapshot.error}");
                      } else {
                        return Text(snapshot.data!);
                });

每次我重建祖先小部件时,StreamBuilder小部件都会永远加载。那有什么问题?

更新

我用这个函数改变了 _streamProductTypes:

 Stream<List<Entity>> readStream() {
    return 
FirebaseFirestore.instance.collection(entityName).withConverter<Entity>(fromFirestore: (snapshot, _) => fromConstructor(snapshot.data()!),
          toFirestore: (entity, _) => entity.toJson(),
        )
        .snapshots()
        .map((event) => event.docs.map((e) => e.data()).toList());
  }

当我单击转到新屏幕然后我再次转到该流屏幕时,没有更多数据。为什么?

4

0 回答 0