Dart StreamBuilder不侦听/更新

Dart StreamBuilder不侦听/更新,dart,flutter,Dart,Flutter,我有一个小部件,它有一个public流。在另一个小部件中,我想根据流的数据更新我的UI。因此,我像往常一样使用StreamBuilder来包装流 在这种情况下,StreamBuilder不会更新,但我可以看到打印输出 我的代码如下所示(原始代码更复杂): 为什么第一个版本的StreamBuilder没有更新 class WidgetA extends StatefulWidget { final _WidgetAState _state = _WidgetAState(); Strea

我有一个小部件,它有一个
public
流。在另一个小部件中,我想根据流的数据更新我的UI。因此,我像往常一样使用
StreamBuilder
来包装流

在这种情况下,
StreamBuilder
不会更新,但我可以看到
打印
输出

我的代码如下所示(原始代码更复杂):

为什么第一个版本的
StreamBuilder
没有更新

class WidgetA extends StatefulWidget {
  final _WidgetAState _state = _WidgetAState();

  Stream<String> get stream => _state?._subject?.stream;

  @override
  _WidgetAState createState() => _state;
}

class _WidgetAState extends State<WidgetA> {
  final BehaviorSubject<String> _subject = BehaviorSubject<String>();

  @override
  Widget build(BuildContext context) {
    return Container(
      child: FlatButton(
        child: const Text('click'),
        onPressed: () => _subject.add(DateTime.now().toString()),
      ),
    );
  }

  @override
  void dispose() {
    _subject.close();
    super.dispose();
  }
}

class WidgetB extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final WidgetA widgetA = WidgetA();
    widgetA.stream.listen((value) => print('value: $value'));

    return Column(
      children: <Widget>[
        widgetA,
        StreamBuilder<Object>(
          stream: widgetA.stream,
          builder: (_, snapshot) => Text('data: ${snapshot.data}'),
        ),
      ],
    );
  }
}
class WidgetB extends StatefulWidget {
  @override
  _WidgetBState createState() => _WidgetBState();
}

class _WidgetBState extends State<WidgetB> {
  final WidgetBBloc bloc = WidgetBBloc();

  @override
  Widget build(BuildContext context) {
    final WidgetA widgetA = WidgetA();
    bloc.init(stream: widgetA.stream);
    bloc.stream.listen((value) => print('value: $value'));

    return Column(
      children: <Widget>[
        widgetA,
        StreamBuilder<Object>(
          stream: bloc.stream,
          builder: (_, snapshot) => Text('data: ${snapshot.data}'),
        ),
      ],
    );
  }
}

class WidgetBBloc {
  Stream<String> get stream => _subject.stream;
  final BehaviorSubject<String> _subject = BehaviorSubject<String>();

  void init({@required Stream<String> stream}) {
    assert(stream != null);
    stream.listen((String s) => _subject.add(s));
  }

  void dispose() {
    _subject.close();
  }
}