在 Android 中,每个 Fragment 都可以使用回调参与填充活动的选项菜单(也称为“appBar 操作”,用颤振的术语来说)Fragment.onCreateOptionsMenu
。我希望在颤振中也有类似的机制,即一些小部件能够向 AppBar 添加按钮(“动作”)。
已经打开了有关此主题的线程,但没有一个报告功能完整的示例并包含针对我遇到的确切技术问题的解决方案。
为此,我曾想过使用以下“典型”结构:
一个 StatefulWidget - 我给它起名
ScaffoldHandler
(ScaffoldHandlerWidget/ScaffoldHandlerState
) - 它包装了整个 Scaffold,并使用InheritedWidget以便小部件树更下方的小部件可以以最佳方式获得对它的引用(使用of()
执行的经典方法dependOnInheritedWidgetOfExactType()
)。ScaffoldHandlerState 将各个子项设置的操作保存在一个字段中,并将它们提供给应用栏。创建 AppBar 的小部件。在该
build()
方法中,它获取要显示的操作调用ScaffoldHandlerState.of()
。mixin ScaffoldChild on State
,应用于小部件使其能够向ScaffoldHandlerState
. 在内部,ScaffoldChild 执行ScaffoldHandlerState.of()
indidChangeDependencies()
(添加动作)和 indeactivate()
(删除动作)。我最初使用
initState()
,dispose()
但这并没有处理 ScaffoldChild 更改位置但没有从小部件树中永久删除的情况。
我遇到的问题ScaffoldAppBar.build
是之前执行ScaffoldChild.didChangeDependencies
的,所以当app-bar创建的时候,ScaffoldChild还是要把它的动作放到ScaffoldHandlerState中。奇怪的是,这个问题是由于在页面中插入 ScaffoldAppBar 和 ScaffoldChild 的简单线性顺序:如果我想创建一个底部应用程序栏而不是顶部应用程序栏,则问题不存在,因为会跑前。ScaffoldChild.didChangeDependencies
ScaffoldAppBar.build
作为解决该问题的解决方法,我插入了对schedule byScaffoldChild.didChangeDependencies
的调用:因此,在 ScaffoldHandler 中插入操作后,应用程序栏将使用新操作进行更新。但是,这个解决方案对我来说似乎是一个 hack。在 stackoverflow 中,我看到很多问题都用 . 我有兴趣了解是否有更好的解决方案,因为我的目的和实际目的是更好地了解小部件的生命周期。 scaffoldHandler.setState
WidgetsBinding.instance.addPostFrameCallback()
addPostFrameCallback + setState
有更好的解决方案吗?
这是我的代码:
(我尽量缩短它,但如果它不是很短很抱歉)