Как отменить назначенный поток StreamBuilder при переходе на другой экран? - PullRequest
0 голосов
/ 12 апреля 2020

Код:

final ref = Firestore.instance.document('some/path');

class MainPage extends StatefulWidget {
  @override
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  Stream _stream;

  @override
  void initState() {
    super.initState();

    _stream = ref.snapshots().map((snapshot) {
      // <--------------------------------------------------------------- line 1
      return snapshot.data;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
        stream: _stream,
        builder: (_, snapshot) {
          if (snapshot.hasData) {
            return RaisedButton(
              onPressed: () => Navigator.push(context, MaterialPageRoute(builder: (_) => Page2())),
              child: Text("Navigate"),
            );
          }
          return CircularProgressIndicator();
        },
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: RaisedButton(
        onPressed: () => ref.updateData({'key': "value"}), // <------ line 2
        child: Text('Update data'),
      ),
    );
  }
}

Этот код воспроизводим, ошибки времени компиляции нет. Позвольте мне дать вам обзор.

Есть 2 экрана Screen1 и Screen2. На первом экране я настроил StreamBuilder, который прослушивает значение, предоставленное с помощью _stream. Все идет нормально.

Но когда я перехожу на Screen2 (см. line 2) и обновляю с него сервер, снимок Screen1 снова создается (см. line 1). Как я могу отменить это Stream, чтобы не беспокоиться о том, когда Screen1 не видно?

...