在Flutter中保持流在屏幕之间打开的正确方法是什么?
例如,如果我有一个Firestore字段(test_field)要在两个屏幕上实时更新,我该怎么做?如果我在第一页上创建一个streambuilder,则该字段的数据会实时更新,但是当我将其传递到第二个屏幕(SubPage)时,它只会在页面加载时更新:
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: _theStream,
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: Text("Loading..."),
);
} else if (snapshot.data.documents.length != 0) {
return SingleChildScrollView(
child: ListView.builder(
physics: ClampingScrollPhysics(),
shrinkWrap: true,
itemCount: snapshot.data.documents.length,
itemBuilder: (BuildContext context, int index) => MainCard(
streamData: snapshot.data.documents[index],
),
主卡:
class DetailsCard extends StatefulWidget {
DetailsCard({this.streamData});
final streamData;
...
Widget build(BuildContext context) {
Text(widget.streamData.data['test_field'] // This updates in realtime
GestureDetector(
onTap: () {
Navigator.push(
context,
NoFadeRoute(
builder: (context) => SubPage(
streamData: widget.streamData,
),
),
);
},
子页面:
class SubPage extends StatefulWidget {
SubPage({this.streamData});
final streamData;
...
Widget build(BuildContext context) {
Text(widget.streamData.data['test_field'] // This only updates on page load
非常感谢!
答案 0 :(得分:1)
流 保持活动状态。
问题是,当您推送新路由时,您将当前值而不是流本身传递给路由。
这意味着,新路由不会监听该流。
因此,与其传递streamData
,不如传递Stream
本身,并让NoFadeRoute
使用StreamBuilder
来收听流。