7

StreamBuilder は常に 2 回呼び出されますか? 最初のデータ用に 1 回、次に入力ストリーム用に 1 回?

次の StreamBuilder を初期化すると、ビルド メソッドが 2 回呼び出されることがわかります。2 番目の呼び出しは、最初の呼び出しから 0.4 秒後です。

ストリーム: ビルド 1566239814897

ストリーム: ビルド 1566239815284

import 'dart:async';
import 'dart:ui';

import 'package:flutter/material.dart';
import 'package:nocd/utils/bloc_provider.dart';

void main() =>
    runApp(BlocProvider<MyAppBloc>(bloc: MyAppBloc(), child: MyApp()));

class MyAppBloc extends BlocBase {
  String _page = window.defaultRouteName ?? "";

  /// Stream for [getPage].
  StreamController<String> pageController = StreamController<String>();

  /// Observable navigation route value.
  Stream get getPage => pageController.stream;

  MyAppBloc() {}

  @override
  void dispose() {
    pageController.close();
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyAppBloc myAppBloc = BlocProvider.of<MyAppBloc>(context);
    return StreamBuilder(
      stream: myAppBloc.getPage,
      initialData: "Build",
      builder: (context, snapshot) {
        print("Stream: " +
            snapshot.data +
            DateTime.now().millisecondsSinceEpoch.toString());
        return Container();
      },
    );
  }
}

StreamBuilder が 2 回呼び出されるのはなぜですか?

4

3 に答える 3

5

StreamBuilder は、初期化時に 2 つのビルド呼び出しを行います。1 回目は初期データ用で、2 回目はストリーム データ用です。

ストリームはすぐにデータを送信することを保証しないため、初期データ値が必要です。に渡すnullinitialData、InvalidArgument 例外がスローされます。

渡されたストリームが null の場合でも、StreamBuilders は常に 2 回ビルドされます。

アップデート:

が提供されている場合でも StreamBuilders が複数回ビルドされる理由の詳細な技術的説明はinitalData、この Flutter の問題スレッドで見つけることができます: https://github.com/flutter/flutter/issues/16465

ブロードキャスト ストリームが初期状態を持つことはできません。データが追加されたときに購読していたか、それを逃したかのどちらかです。非同期単一サブスクリプション ストリームでは、追加されたリッスン コールは、次のマイクロタスクまたは次のイベント ループまで呼び出されません (覚えていない、依存する可能性があります)。現在のフレームでストリーミングします。- ジョナウィリアムズ

于 2019-08-19T18:49:56.113 に答える