有没有办法像设置AppBar一样设置CupertinoNavigationBar的高度

时间:2019-10-21 15:02:07

标签: flutter

我在手动设置CupertinoNavigationBar的大小时遇到​​问题,并且我知道您可以通过执行以下操作,使用appBar小部件为PreferredSize设置大小:

appBar: PreferredSize(
  preferredSize: Size.fromHeight(60.0),
  child: AppBar(
    flexibleSpace: Widget(),
  )
),

但是,如果您为CupertinoNavigationBar尝试此操作,则会收到一条错误消息,指出:

  

'AppBar'不是'ObstructingPreferredSizeWidget'类型的子类型

有没有已知的方法可以手动设置CupertinoNavigationBar的高度?

1 个答案:

答案 0 :(得分:0)

通过在CupertinoNavigationBar中进行一些挖掘,看起来大小是预先确定的,但也基于MediaQuery填充。现在,这确实是一个“黑客”,但它确实给了您某种所要遵循的行为。与此相关的主要问题是,该解决方案使用Cupertino Sliver NavigationBar而不是基础解决方案。这意味着,当您向上滚动时,转换目标会以相当难看的方式放置在“中间”部分上方。您可能会想到一些解决方法。我尝试了没有Sliver的解决方案,但无法正常工作。我个人认为,构建自己的CupertinoNavigationBar版本是克服Flutter团队实现的静态高度的最简单方法。我所做的是使用CompositedTransformFollower / Target小部件,并使用MediaQuery小部件强制了应用栏的高度。这是代码:

//outside of build method 
final LinkLayer link = LinkLayer();

//within build method
MediaQuery (
  data: MediaQuery.of (context).copyWith (
      padding: MediaQuery.of (context).padding.copyWith (
          top: MediaQuery.of (context).padding.top + 90
      )
  ),
  child: Stack(
    children: <Widget>[

      CustomScrollView(
        slivers: <Widget>[
          CupertinoSliverNavigationBar (
            largeTitle: CompositedTransformTarget(
              link: link,
              child: SizedBox(
                width: 130,
                height: 110,
              ),
            ),
            middle: Text('middle'),
          )
        ],
      ),

      CompositedTransformFollower(
        link: link,
        child: Stack(
          alignment: Alignment.bottomCenter,
          children: <Widget>[
            Container(
              alignment: Alignment.bottomCenter,
              height: 110,
              color: Colors.blueGrey,
            )
          ],
        ),
      )
    ],
  ),
)

如果您选择复制CupertinoNavigationBar,则要解决的const是:_kNavBarPersistentHeight。