Несколько StreamBuilder внутри ListView не удалось прослушать один и тот же поток - PullRequest
0 голосов
/ 02 января 2019

У меня есть 2 StreamBuilder внутри ListView, которые слушают то же самое Stream, то есть valueStream. Внутри этого StreamBuilder у меня есть SwitchListTile, который добавляет новое значение к valueStream.

Это мой Stream:

Observable<bool> get valueStream => valueController.stream;

Это мой ListView:

ListView(
    children: <Widget>[
        Switch1(key: UniqueKey(),),
        Switch2(key: UniqueKey(),),
    ],
),

Это Switch1 виджет:

class Switch1 extends StatefulWidget {
  const Switch1(
      {@required Key key})
      : super(key: key);

  @override
  _Switch1State createState() => _Switch1State();
}

class _Switch1State extends State<Switch1> {
  DummyBloc _dummyBloc;

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      key: UniqueKey(),
      stream: _dummyBloc.valueStream,
      builder: (context, AsyncSnapshot<bool> snapshot) {
        print('rebuild Switch1');
        if(!snapshot.hasData) return Container();
        return SwitchListTile(
          value: snapshot.data,
          onChanged: _dummyBloc.updateValue,
        );
      },
    );
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _dummyBloc = DummyBloc();
  }
}

Это Switch2 виджет:

class Switch2 extends StatefulWidget {
  const Switch2(
      {@required Key key})
      : super(key: key);

  @override
  _Switch2State createState() => _Switch2State();
}

class _Switch2State extends State<Switch2> {
  DummyBloc _dummyBloc;

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      key: UniqueKey(),
      stream: _dummyBloc.valueStream,
      builder: (context, AsyncSnapshot<bool> snapshot) {
        print('rebuild Switch2');
        if(!snapshot.hasData) return Container();
        return SwitchListTile(
          activeColor: Theme.of(context).buttonColor,
          value: snapshot.data,
          onChanged: _dummyBloc.updateValue,
        );
      },
    );
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _dummyBloc = DummyBloc();
  }
}

Если я коснусь виджета Switch1, StreamBuilder внутри Switch2 якобы перестроится, и наоборот, но этого не произошло. Я пытался добавить UniqueKey к Switch1 и Switch2, но это не помогает. Любое предложение, как сделать эту работу?

...