Flutter SliverPersistentHeader 导致“滚动时底部溢出”

Posted

技术标签:

【中文标题】Flutter SliverPersistentHeader 导致“滚动时底部溢出”【英文标题】:Flutter SliverPersistentHeader is causing "bottom overflow when scroll" 【发布时间】:2020-05-23 19:56:05 【问题描述】:

我有一个SliverPersistentHeader,当用户滚动屏幕时会导致bottom overflowed

我该如何解决?

    return CustomScrollView(
      slivers: <Widget>[
        SliverPersistentHeader(
          pinned: false,
          delegate: DynamicSliverHeaderDelegate(
            maxHeight: 256,
            minHeight: 186,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.start,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                _topo(context, grupo),
                _infoGrupo(context, grupo),
              ],
            ),
          ),
        ),

        // TODO: Lista do grupo 
        SliverFillViewport(
          delegate: SliverChildListDelegate(
            [
              Container(
                padding: EdgeInsets.only(top: 100),
                color: Colors.green.withOpacity(0.2),
                child: Column(
                  children: <Widget>[
                    Text('TODO... A construir'),
                  ],
                ),
              ),
            ],
          ),
        ),
      ],
    );

// .....

class DynamicSliverHeaderDelegate extends SliverPersistentHeaderDelegate 
  final Widget child;
  final double maxHeight;
  final double minHeight;

  const DynamicSliverHeaderDelegate(
    @required this.child,
    this.maxHeight = 250,
    this.minHeight = 80,
  );

  @override
  Widget build(
      BuildContext context, double shrinkOffset, bool overlapsContent) 
    return child;
  

  // @override
  // bool shouldRebuild(DynamicSliverHeaderDelegate oldDelegate) => true;

  @override
  bool shouldRebuild(DynamicSliverHeaderDelegate oldDelegate) 
    return maxHeight != oldDelegate.maxHeight ||
        minHeight != oldDelegate.minHeight ||
        child != oldDelegate.child;
  

  @override
  double get maxExtent => maxHeight;

  @override
  double get minExtent => minHeight;

【问题讨论】:

【参考方案1】:

通过使用SingleChildScrollView´ withNeverScrollableScrollPhysics` physics 包装 DynamicSliverHeaderDelegate 列子级来解决此问题。

return CustomScrollView(
  slivers: <Widget>[
    SliverPersistentHeader(
      pinned: false,
      delegate: DynamicSliverHeaderDelegate(
        maxHeight: 256,
        minHeight: 186,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            _topo(context, grupo),
            _infoGrupo(context, grupo),
          ],
        ),
      ),
    ),
    // TODO: Lista do grupo 
    // ...
  ],
);

【讨论】:

抱歉,您能更新一下您的代码吗?它丢失并且没有显示最终结果-谢谢! @romaneso 作者解释了解决方案。明确地说,我用我的答案中的修复更新了代码。【参考方案2】:

完整的解决方法是:

 return CustomScrollView(
      slivers: <Widget>[
        SliverPersistentHeader(
          pinned: false,
          delegate: DynamicSliverHeaderDelegate(
            maxHeight: 256,
            minHeight: 186,
            child: SingleChildScrollView(
              physics: const NeverScrollableScrollPhysics(),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  _topo(context, grupo),
                  _infoGrupo(context, grupo),
                ],
              ),
            ),
          ),
        ),
        // TODO: Lista do grupo
        // ...
      ],
    );
   

【讨论】:

以上是关于Flutter SliverPersistentHeader 导致“滚动时底部溢出”的主要内容,如果未能解决你的问题,请参考以下文章

[Flutter] flutter项目一直卡在 Running Gradle task 'assembleDebug'...

flutter 日志输出,Flutter打印日志,flutter log,flutter 真机日志

Flutter开发 Flutter 包和插件 ( Flutter 包和插件简介 | 创建 Flutter 插件 | 创建 Dart 包 )

flutter与原生混编(iOS)

Flutter-布局

如何解决flutter gradle build error?C:\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 991