gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:20:58 30 4
gpt4 key购买 nike

有以下内容。使用 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com