flutter - 如何在 flutter block 模式中重用以前的状态字段?

标签 flutter dart bloc

有以下内容。使用 sliding_up_panel它具有带有消息的正文和面板内容中的不同 View ,该 View 在底部栏的单击操作中弹出。

  @override
  Stream<AppState> mapEventToState(
    AppEvent event,
  ) async* {
    if (event is LoadChat) {
      List<Msg> msgs = await Api.getMessages();
      yield LoadedChat(messages: msgs);
    } else if (event is OrderPanelOpen) {
      yield OpenedPanelState();
    } else if (event is OrderPanelClose) {
      yield ClosedPanelState();
    }
  }

目标是在面板打开时隐藏 appBar。 appBar 存在于 AppLayout 中,它是在 Scaffold 中保存 SlidingUpPanel 小部件本身的父级。
class _AppLayoutState extends State<AppLayout> {
  @override
  Widget build(BuildContext context) {
    var bloc = BlocProvider.of<AppBloc>(context);
    return Container(
      child: Scaffold(
        appBar: widget.showAppBar
            ? AppBar(...)
            : null,
        bottomNavigationBar: BottomAppBar(...),
        body: SlidingUpPanel(...),
      ),
    );
  }
}

以下是将面板事件添加到 bloc 的操作
 IconButton(
   icon: Icon(Icons.description),
   onPressed: () {
     if (widget.pannelCtrl.isPanelClosed()) {
       widget.pannelCtrl.open();
       bloc.add(OrderPanelOpen());
     } else {
       widget.pannelCtrl.close();
       bloc.add(OrderPanelClose());
     }
 })

这里的问题是 SlidingUpPanel 有一个无论面板打开还是关闭都需要显示消息的主体。如果面板打开和关闭事件通过 bloc 映射到状态,则这些打开和关闭事件必须是单独的状态,但来自当前状态的消息必须通过作为新状态的构造函数参数或其他方式传递到新状态。是实现这一目标的正确方法还是我在这里缺少的其他更清洁的东西。
class ClosedPanelState implements LoadedChat {
  final messagesArg;
  ClosedPanelState({this.messagesArg});

  @override
  Widget get currentView => Chat(messages: this.messagesArg);

  @override
  List<Object> get props => [];

  @override
  bool get showAppBar => true;

  @override
  String get title => 'Order Food';

  @override
  List<Msg> get messages => messages;
}

最佳答案

根据您的问题标题,您可以做一件事。

对于您的 bloc 类,您可以创建一个类似堆栈的变量(您可以根据需要使用自己的 LIFO 堆栈实现或使用列表)。您的 bloc 类必须是 Singleton 才能保存事件。
static final List<AppEvent> _events = new List<AppEvent>();
在您的 _mapEventToState 实现中,将调用的事件添加到变量中:

@override
  Stream<AppState> mapEventToState(
    AppEvent event,
  ) async* {
    _events.add(event); // New Line
    if (event is LoadChat) {
      List<Msg> msgs = await Api.getMessages();
      yield LoadedChat(messages: msgs);
    } else if (event is OrderPanelOpen) {
      yield OpenedPanelState();
    } else if (event is OrderPanelClose) {
      yield ClosedPanelState();
    }
  }

稍后您编写一个方法来调用堆栈/列表上的最后一个事件。
dispatchPreviousState() {
    this.add(_events.removeLast());
  }

这对我有用,可以调用最新的 Event 并再次调度它。

关于flutter - 如何在 flutter block 模式中重用以前的状态字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59366726/

相关文章:

android - 每当我添加某个库并在元数据部分修改 androidmanifest.xml 时,flutter 应用程序都会崩溃

android - 如何检查按钮是否被按下

android - Flutter - 为 API 实现 JSON getter

json - 从JSON文件使用i18n时,应用启动时出现黑屏

firebase - Dart null与Null

dart - StreamBuilder 抛出脏状态

flutter - 如何在Flutter中将相同的BLoC用于不同的小部件?

Flutter - 如何将图像定义转换为图标定义?

flutter - 如何自定义 flutter 中的步进器并通过内容中的小部件进行控制?

flutter - 如何更改在谷歌地图上显示我的位置的图标? [ flutter ]