Flutter:通过路线保持水流畅通吗?

时间:2019-06-23 18:33:35

标签: flutter google-cloud-firestore

在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

非常感谢!

1 个答案:

答案 0 :(得分:1)

推送新路由时,

保持活动状态。

问题是,当您推送新路由时,您将当前值而不是流本身传递给路由。

这意味着,新路由不会监听该流。

因此,与其传递streamData,不如传递Stream本身,并让NoFadeRoute使用StreamBuilder来收听流。