Почему StreamBuilder использует initialData несколько раз, а не последний снимок?

Я, наверное, просто неправильно понимаю поток дротика, но когда я это сделаю:

TabBarView(
  children: [
    ...
    StreamBuilder(
      builder(context, url){ 
        ...
        print(url);
        ...
      },
      stream: () async* { ... }().asBroadcastStream(),
      initialData: 'Dope',
    )
    ...
  ]
)

Я получаю странное поведение при рендеринге StreamBuilder с помощью TabBarView.

Во-первых, я должен использовать asBroadcastStream(), иначе я получу:

Плохое состояние: поток уже прослушан

что я признаю, это плохое решение.

Но пока решение работает, возврат к StreamBuilder в TabBarView теперь будет перестраивать повторное использование initialData, а не последнего моментального снимка потока. Вот результат печати при двойном возврате на вкладку:

I/flutter (14541): допинг
I/ флаттер (14541): правильный URL-адрес
I/flutter (14541): допинг
I/ флаттер (14541): допинг

Я представляю, что обе проблемы связаны, но я не понимаю, почему StreamBuilder повторно использует async* и initialData

1 ответ

Решение

Вероятно, ваш виджет воссоздается, преобразуйте его в StatefulWidget и переопределить dispose() с print(disposed) внутри, чтобы подтвердить.

Также внутри StreamBuilder распечатать snapshot.connectionState, твой connectionState is probably changing to waiting to active and so the builder is being called with initalData.

This is what I can guess for the little of code you posted, test this out and let me know how it goes.

Другие вопросы по тегам