当我重建一个小部件时,它是另一个包含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());
}
当我单击转到新屏幕然后我再次转到该流屏幕时,没有更多数据。为什么?