【问题标题】:Can we shrink up widgets when scrolling without Slivers in flutter?我们可以在没有 Slivers 的情况下滚动时缩小小部件吗?
【发布时间】:2020-10-19 13:21:26
【问题描述】:

我必须创建这个疯狂的布局,顶部有 3 个小部件,当用户向下滚动页面时,它们应该收缩/缩回。但由于元素是动态的,而且我在此处的主体上有 2 个选项卡,因此它不适用于 Sliver。除了 Slivers 之外,还有其他方法可以缩小/缩回这 3 个小部件吗?

理想情况下,“选择日期”行和选项卡应该缩小,而“过滤器按钮”行应该在用户滚动时仍然可见。

【问题讨论】:

  • 你能从你的布局中添加一张图片吗?
  • 当然。已添加图片。
  • 您可以将“选择日期”行包装在动画容器中,其中高度应由使用滚动控制器获得的滚动位置量控制。
  • 嘿,“Doc”,这听起来很有希望。您能帮我提供一些代码示例吗?

标签: flutter dart


【解决方案1】:

如果您需要这样的东西,请按照以下步骤操作。

版块和新闻故事小部件。

class Section extends State {
  @override
  Widget build(BuildContext context) {
    return MultiSliver(
      pushPinnedChildren: true,
      children: <Widget>[
        SliverPersistentHeader(
          pinned: true,
          ...
        ),
        if (!infinite)
          SliverAnimatedPaintExtent(
            child: SliverList(...),
          )
        else
          SliverList(...),
      ],
    );
  }
}

class NewsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CustomScrollView(
      slivers: <Widget>[
        Section(infinite: false),
        Section(infinite: true),
      ],
    );
  }
}

列出 Sliver 实现。

class NewsPage extends StatelessWidget {
  const NewsPage({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          Strings.of(context).pages.news.title,
        ),
      ),
      body: View<NewsModel>(
        onModelReady: (model) => model.load(),
        builder: (context, model, _) {
          return Scrollbar(
            child: CustomScrollView(
              slivers: [
                CupertinoSliverRefreshControl(
                  onRefresh: () => model.load(),
                ),
                NewsSection(
                  model: model.topStories,
                  infinite: false,
                ),
                NewsSection(
                  model: model.newStories,
                  infinite: true,
                ),
                SliverToBoxAdapter(
                  child: SizedBox(height: MediaQuery.of(context).viewPadding.bottom),
                ),
              ],
            ),
          );
        },
      ),
    );
  }
}

Complete Implementation can be found here.

【讨论】:

  • 你好达什沙阿。我不能拥有 Slivers。这个想法是在没有任何 Slivers 的情况下创建这种“撤回”。
猜你喜欢
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多