Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在有状态小部件外部调用方法以使用flutter Bloc更新UI_Flutter_Dart_Bloc_Stream Builder - Fatal编程技术网

在有状态小部件外部调用方法以使用flutter Bloc更新UI

在有状态小部件外部调用方法以使用flutter Bloc更新UI,flutter,dart,bloc,stream-builder,Flutter,Dart,Bloc,Stream Builder,我实施了countetEvent和counterBloc: abstract class CounterEvent {} class IncrementEvent extends CounterEvent {} class DecrementEvent extends CounterEvent {} 和反集团: import 'dart:async'; import 'counter_event.dart'; class CounterBloc { int _counter = 0;

我实施了countetEvent和counterBloc:

abstract class CounterEvent {}

class IncrementEvent extends CounterEvent {}

class DecrementEvent extends CounterEvent {}
和反集团:

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();
}

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"),
      ),
    );
  }
}
我有两个按钮,一个用于递增,一个用于递减。在main.dart文件(如soo)中使用减量时,只需找到减量:

    RaisedButton(
                    onPressed: () =>
                        _bloc.counterEventSink.add(DecrementEvent()),
                    child: Text("Minus"),
                  )
这将更新bloc中的变量以及小部件。但是对于增量,当我使用函数从main.dart外部调用它时,它会增加bloc中的值,但UI不会更新。我就是这样实施的:

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

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();
}

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

类按钮扩展StatefulWidget{
@凌驾
_ButtonState createState()=>\u ButtonState();
}
类_ButtonState扩展状态{
final _bloc=CounterBloc();
@凌驾
小部件构建(构建上下文){
返回容器(
孩子:升起按钮(
onPressed:()=>_bloc.counterEventSink.add(IncrementEvent()),
子项:文本(“添加”),
),
);
}
}
如何在小部件之外使用bloc事件并更新UI?或者简单地说,如何从另一个类更新有状态的小部件。

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