FutureBuilder / StreamBuilder вызывал ненужные времена, когда Navigator.push? - PullRequest
0 голосов
/ 04 ноября 2019

My FutureBuilder/StreamBuilder вызывается в ненужные моменты при навигации с использованием push. Можно ли остановить без изменений navigator.push?

 Stream<List<Categorie>> getFromBloc;

  @override
  void didChangeDependencies() {
    getFromBloc = getData();
    super.didChangeDependencies();
  }

внутри state, снаружи build метод

  Stream<List<Categorie>> getData()=>
     _categoryBloc.category;

метод построения

   StreamBuilder(
        stream: getFromBloc,//_categoryBloc.category,
        builder: (_, AsyncSnapshot<List<Categorie>> snapshot) {
          if (snapshot.data == null) {
               ...
          } else {
            ...
            GestureDetector(
              child:...,
              onTap:(){
              Navigator.of(context).pushNamed('/subCategory',arguments: Arguments(postModel: post));
              }
          }
        })

Я добавил точку отладки внутри streamBuilder. при навигации он работает несколько раз.

1 Ответ

0 голосов
/ 04 ноября 2019

pushNamed вызывается каждый раз, когда getFromBloc поток изменяется (получает новые данные). Вы не должны вызывать его где-либо внутри функции сборки вообще. Возможно, вы захотите сделать это так:

getFromBloc.first.then((data) => Navigator.of(context).pushNamed('/subCategory',arguments: Arguments(postModel: post)))

Например, вы можете сделать это в initState. Обратный вызов будет выполнен только один раз после того, как поток getFromBloc получит новое значение.

UPD : я вас неправильно понял. Каждый раз, когда вы нажимаете новый маршрут, не только StreamBuilder перестраивается, но и каждая страница в стеке перестраивается, чтобы обновить кнопку возврата. Для этого есть проблема .

Это работает, как задумано. В общем, вы должны предполагать, что все виджеты могут быть перестроены в любое время, а что нет, это в основном просто оптимизация.

В частности, маршруты будут перестраиваться, потому что их состояние навигатора изменилось, поэтому им может потребоваться обновитькак они рисуют кнопки назад и тому подобное.

...