删除 CupertinoSliverNavigationBar 上的填充

Remove Padding on CupertinoSliverNavigationBar

我正在尝试使用 CupertinoSliverNavigationBar,实际上它很棒,但由于某些原因我无法将尾部放在导航栏的末尾。我抬头一看,我(猜猜我)发现里面有Padding

这是我的代码

   new CupertinoPageScaffold(
        child: new CustomScrollView(
          slivers: <Widget>[
            new CupertinoSliverNavigationBar(
              largeTitle: new Text('Tasks'),
              trailing: new CupertinoButton(
                child: new Icon(AdditionalCupertinoIcons.compose, size: 32.0),
                onPressed: () {
                  showDialog(
                      context: context,
                      builder: (BuildContext context) {
                        return new CupertinoAlertDialog();
                      });
                },
                padding: EdgeInsets.all(0.0),
              ),
            )
          ],
        ),
      ),

遗憾的是,无能为力

正在查看 this line of source code, you can see that they are using a Padding at the end, which is _kNavBarEdgePadding,即 16.0start.

也一样

这意味着使用 CupertinoSliverNavigationBar 您将无法删除 Padding,因为没有访问点可以更改它。您必须为此创建 自己的小部件

_CupertinoPersistentNavigationBar widget contains the Padding and is used by CupertinoSliverNavigationBar, as can be seen here and for completion here.

有一种简单的方法可以在屏幕上移动小部件:

Widget _adjustNavigationBarButtonPosition(Widget button, double x) {
    if (button == null) return null;

    return Container(
        transform: Matrix4.translationValues(x, 0, 0),
        child: button,
    );
}

使用此方法包装您的 CupertinoButton 并指定一个偏移量。要完全删除填充,偏移量应为 16.0.

您可以使用 Matrix4.translationValues 在容器内移动子项。在您的情况下,x Matrix4.translationValues(12, 0, 0), 应该为正,以便将尾随向右移动。

 new CupertinoPageScaffold(
    child: new CustomScrollView(
      slivers: <Widget>[
        new CupertinoSliverNavigationBar(
          largeTitle: new Text('Tasks'),
          trailing: Container(
           transform: Matrix4.translationValues(12, 0, 0),
           child : CupertinoButton(
            child: new Icon(AdditionalCupertinoIcons.compose, size: 32.0),
            onPressed: () {
              showDialog(
                  context: context,
                  builder: (BuildContext context) {
                    return new CupertinoAlertDialog();
                  });
            },
            )
          ),
        )
      ],
    ),
  ),