Flutter:当小部件没有父/子关系时,我如何从小部件B调用小部件a中的函数



我的应用程序有以下结构,其中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(,然后将函数向下传递给使用它的节点(ChatHeaderChatFooter(。您还可以尝试在"提升状态"之后利用InheritedWidget,避免将方法发送到小部件链中。

现在,这是Flutter应用程序(以及整体声明性框架(反复出现的主题,也是一个可以有多种解决方案的问题。我的建议是,您可以查看不同的状态管理选项,如blocprovidermobxriverpodrxdartreduxevent_bus_plus,仅举几例。所说的库将为您提供每个用例所需的抽象,并帮助您避免实现真正复杂的逻辑,因为您可能需要自己解决类似的问题。

当然,这对你的项目来说是一个重要的决定,所以我建议你好好看看,选择你觉得舒服的或与你以前做过的类似的东西。

祝我的Flutter开发伙伴好运,明智地选择:p

您可以使用一些事件机制向MessageDao通知应用程序中的事件,例如AudioRecordingStartedEvent

  1. MessageDao上,您订阅了该事件并停止播放音频
  2. ChatFooter上,您启动该事件

在pub.dev上,许多实现EventBus的库,例如event_bus_plus

相关内容

  • 没有找到相关文章