【发布时间】:2021-11-24 09:05:09
【问题描述】:
如何在子窗口小部件(页面)中更新根脚手架的某些属性。
这是我的根脚手架中的一个 sn-p。
CupertinoPageScaffold(
resizeToAvoidBottomInset:
state.resizeToAvoidBottomInsets, //update this here
child: CupertinoTabScaffold(
controller: _tabController,
tabBar: CupertinoTabBar(
onTap: onTap,
items: widget.items,
),
tabBuilder: (BuildContext context, index) {
return StatusBarPadding(child: _tabs[index]);
}),
),
docs 说,我应该添加一个侦听器以避免嵌套脚手架(例如更新 resizeToAvoidBottomInset)。 但是,这仅适用于每个选项卡的一页。当我嵌套选项卡时,我无法再直接访问它们。
我尝试了两种解决方案,我将在下面解释(+问题):
解决方案 1:提供者
我使用 Provider 来跟踪全局导航栏状态:
class NavbarState extends ChangeNotifier {
bool _resizeBottom;
NavbarState(this._resizeBottom);
get resizeBottom => _resizeBottom;
void setResizeBottom(bool state) {
_resizeBottom = state;
notifyListeners();
}
}
然后在我的页面中,我在 initState-Method 中使用BlocProvider.of<NavbarState>(context).setResizeBottom(val)(分别为 dispose)设置状态。
这有2个问题:
-
调用notifyListeners会在consumer中触发一个setState,不能在initState方法中调用setState。
-
我必须在每个 initState 和 dispose 方法中声明它。
解决方案 2:集团
我再一次拥有了一个全局状态,但它不必继承自 `ChangeNotifier`。我使用 `NavbarBloc` 类跟踪状态。然后我可以在onGenerateRoute 方法中添加一个事件。这比提供者方法更方便,因为我只在一个地方管理这个状态。
但是,还有一个很大的问题:
当我返回导航时,onGenerateRoute 方法没有被调用,因此状态没有得到更新。
最简单的解决方案是什么
至少从应用程序开发人员的角度来看,如果我可以只询问位于活动导航器中的当前小部件,那就太好了。
导航栏示例
这是给定 cupertinotabscaffold 的 3 个导航器的图示。
中间的“堆栈”处于活动状态,屏幕上可以看到最顶部的小部件。因此,目前 resize 参数应该是错误的。在堆栈之间导航(点击导航图标),调整大小参数应该调整。此外,在单个堆栈(push、pop)之间导航时,还应调整调整大小参数(例如,在弹出时,参数应设置为 true)。
我找不到类似的东西。所以我需要你的帮助。
【问题讨论】:
标签: flutter flutter-navigation flutter-cupertino