调用有状态小部件外部的方法,用flutter Bloc更新UI



我已经实现了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();
}

}

在我的主页上,我声明:

final _bloc = CounterBloc();

我有两个按钮,一个用来递增,一个用于增量。减量在main.dart文件(如soo:(中使用时可以找到

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

这将更新区块中的变量以及小部件。但对于增量,当我用函数从main.dart外部调用它时,它会增加块中的值,但UI不会更新。这就是我实现它的方式:

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"),
),
);
}
}

如何在小部件之外使用bloc事件并更新UI?或者简单地说,我如何从另一个类更新一个有状态的小部件。

我的这个解决方案可能会回答您的问题。这就是我如何解决不同区块之间的一些通信问题。您也可以查找继承的小部件,但是,我还没有尝试过。

最新更新