我的应用程序有以下结构,其中ChatScreen包含ChatHeader和ChatFooter。
---ChatHeader.dart --- MessageDao.dart
ChatScreen.dart ---
---ChatFooter.dart
在ChatHeader小部件中,我调用了另一个名为MessageDao.dart的小部件。这个小部件生成了一个按钮,用户可以按下该按钮来播放音频。
在ChatFooter小部件中,该小部件包含一个不同的按钮,用户可以按下该按钮使用麦克风进行录制。
当我使用ChatHeader中的按钮播放音频时->道,这个还可以。但是,如果我单击ChatFooter小部件中的按钮开始录制,而正在从第一个按钮播放音频,则此音频不会停止播放。我录音的时候它一直在播放。我在MessageDao中有一个stopPlay((函数可以使用,但我不知道如何从小部件B调用小部件a中的函数。
或者换句话说,如何从ChatFooter.dart内部调用MessageDao.stopPlaying((?
在这种情况下,理想的解决方案是从React中取出一页并"提升状态";这意味着无论子级上的方法是什么,都应该提升到小部件树中的更高节点(例如ChatScreen
(,然后将函数向下传递给使用它的节点(ChatHeader
和ChatFooter
(。您还可以尝试在"提升状态"之后利用InheritedWidget
,避免将方法发送到小部件链中。
现在,这是Flutter应用程序(以及整体声明性框架(反复出现的主题,也是一个可以有多种解决方案的问题。我的建议是,您可以查看不同的状态管理选项,如bloc
、provider
、mobx
、riverpod
、rxdart
、redux
或event_bus_plus
,仅举几例。所说的库将为您提供每个用例所需的抽象,并帮助您避免实现真正复杂的逻辑,因为您可能需要自己解决类似的问题。
当然,这对你的项目来说是一个重要的决定,所以我建议你好好看看,选择你觉得舒服的或与你以前做过的类似的东西。
祝我的Flutter开发伙伴好运,明智地选择:p
您可以使用一些事件机制向MessageDao
通知应用程序中的事件,例如AudioRecordingStartedEvent
。
- 在
MessageDao
上,您订阅了该事件并停止播放音频 - 在
ChatFooter
上,您启动该事件
在pub.dev上,许多实现EventBus的库,例如event_bus_plus