Вызов метода вне виджета с отслеживанием состояния для обновления пользовательского интерфейса с помощью flutter Bloc

Я реализовал countetEvent и counterBloc:

abstract class CounterEvent {}

class IncrementEvent extends CounterEvent {}

class DecrementEvent extends CounterEvent {}

и counterBloc:

import 'dart:async';
import 'counter_event.dart';

class CounterBloc {
int _counter = 0;

final _counterStateController = StreamController<int>();
StreamSink<int> get _inCounter => _counterStateController.sink;
Stream<int> get counter => _counterStateController.stream;

final _counterEventController = StreamController<CounterEvent>();
Sink<CounterEvent> get counterEventSink => _counterEventController.sink;

CounterBloc() {
_counterEventController.stream.listen(_mapEventToState);
} 

void _mapEventToState(CounterEvent event) {
if (event is IncrementEvent)
  _counter++;
else
  _counter--;

_inCounter.add(_counter);
}

void dispose() {
_counterStateController.close();
_counterEventController.close();
}

}

и в My main.dart я заявил:

  final _bloc = CounterBloc();

У меня есть две кнопки: одна для увеличения, а другая для увеличения. декремент работает, просто найдите его при использовании в файле main.dart, например soo:

    RaisedButton(
                    onPressed: () =>
                        _bloc.counterEventSink.add(DecrementEvent()),
                    child: Text("Minus"),
                  )

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

children: [
                  Button(), /// A stateful widget that returns a button
                  RaisedButton(
                    onPressed: () =>
                        _bloc.counterEventSink.add(DecrementEvent()),
                    child: Text("Minus"),
                  ),
                ],

Это класс кнопки:


class Button extends StatefulWidget {
  @override
  _ButtonState createState() => _ButtonState();
}

class _ButtonState extends State<Button> {
  final _bloc = CounterBloc();

  @override
  Widget build(BuildContext context) {
    return Container(
      child: RaisedButton(
        onPressed: () => _bloc.counterEventSink.add(IncrementEvent()),
        child: Text("Add"),
      ),
    );
  }
}

Как я могу использовать события блока вне виджета и обновлять пользовательский интерфейс? Или, проще говоря, как я могу обновить виджет с отслеживанием состояния из другого класса.


person Adrian    schedule 03.10.2020    source источник


Ответы (1)


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

person w461    schedule 06.10.2020