Flutter SliverAppBar 与选项卡覆盖内容

2023-11-26

我已经遵循了这个教程(https://medium.com/@diegovoper/flutter-collapsing-toolbar-sliver-app-bar-14b858e87abe)创建带有 TabBar 的折叠工具栏。

问题是,当我滚动正文时,正文内容会覆盖选项卡栏。

这是代码:

@override
Widget build(BuildContext context) {
return Scaffold(
  body: DefaultTabController(
    length: 2,
    child: NestedScrollView(
      headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
        return <Widget>[
          SliverAppBar(
            expandedHeight: 200.0,
            floating: false,
            pinned: true,
            flexibleSpace: FlexibleSpaceBar(
                centerTitle: true,
                title: Text("Collapsing Toolbar",
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 16.0,
                    )),
                background: Image.network(
                  "https://images.pexels.com/photos/396547/pexels-photo-396547.jpeg?auto=compress&cs=tinysrgb&h=350",
                  fit: BoxFit.cover,
                )),
          ),
          SliverPersistentHeader(
            delegate: _SliverAppBarDelegate(
              TabBar(
                labelColor: Colors.black87,
                unselectedLabelColor: Colors.grey,
                tabs: [
                  Tab(icon: Icon(Icons.info), text: "Tab 1"),
                  Tab(icon: Icon(Icons.lightbulb_outline), text: "Tab 2"),
                ],
              ),
            ),
            pinned: true,
          ),
        ];
      },
      body: Text("Sample text"),
    ),
  ),
);

代表:

class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
  _SliverAppBarDelegate(this._tabBar);

  final TabBar _tabBar;

  @override
  double get minExtent => _tabBar.preferredSize.height;
  @override
  double get maxExtent => _tabBar.preferredSize.height;

  @override
  Widget build(
      BuildContext context, double shrinkOffset, bool overlapsContent) {
    return new Container(
      child: _tabBar,
    );
  }

  @override
  bool shouldRebuild(_SliverAppBarDelegate oldDelegate) {
    return false;
  }
}

对此有什么想法吗?


我花了几天时间找出问题所在。事实证明它可以通过以下方式解决扩展嵌套滚动视图 1.0.1正如@niegus上面提到的,尽管他使用的是旧版本,所以它对我不起作用。但我已经用最新版本修复了
这是一个演示 gif:
https://giphy.com/gifs/lMyFPbu74ycEaQFB1v

实现步骤
1.在 pubspec.yaml 中添加插件

updated
扩展嵌套滚动视图:^3.0.0

2.将代码粘贴到main.dart中

import 'dart:async';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart' as extend;
import 'package:flutter/material.dart';


void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  var scrollController = ScrollController();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MatchFragment());
  }

}
class MatchFragment extends StatefulWidget {
  @override
  _MatchFragmentState createState() => _MatchFragmentState();
}

class _MatchFragmentState extends State<MatchFragment>  with TickerProviderStateMixin {
  TabController primaryTC;

  @override
  void initState() {
    primaryTC = new TabController(length: 2, vsync: this);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final double statusBarHeight = MediaQuery.of(context).padding.top;
//var tabBarHeight = primaryTabBar.preferredSize.height;
    var pinnedHeaderHeight =
//statusBar height
    statusBarHeight +
        //pinned SliverAppBar height in header
        kToolbarHeight;
    return Scaffold(
        body: DefaultTabController(
          length: 2,
            child: extend.NestedScrollView(
                headerSliverBuilder: (c, f) {
                  return <Widget>[
                  SliverAppBar(
                  pinned: true,
                  expandedHeight: 200,
                  title: Text('Title'),
                  flexibleSpace: FlexibleSpaceBar(
                  background: Image.network(
                  "https://images.pexels.com/photos/396547/pexels-photo-396547.jpeg?auto=compress&cs=tinysrgb&h=350",
                  fit: BoxFit.cover,
                  ))
                  ),

                  ];

                },
                pinnedHeaderSliverHeightBuilder: () {
                  return pinnedHeaderHeight;
                },
                body: Column(
                  children: <Widget>[
                    TabBar(
                      controller: primaryTC,
                      labelColor: Colors.black87,
                      unselectedLabelColor: Colors.grey,
                      tabs: [
                        Tab(text: "Tab1"),
                        Tab(text: "Tab2"),
                      ],
                    ),
                    Expanded(
                      child: TabBarView(
                        controller: primaryTC,
                        children: <Widget>[
                           Text('This is tab one'),
                           Text('This is tab one'),
                        ],
                      ),
                    )
                  ],
                )

            ),
        )
    );


}

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter SliverAppBar 与选项卡覆盖内容 的相关文章

随机推荐

  • 使用 C# 列出回收站中的文件名,而不使用任何外部文件

    我想要一个使用 c 代码检索回收站 在 win 7 上 中的文件名的函数 该框架似乎没有包含任何内容来实现这一目标 目录 Getfiles 不会起作用 是吗 我发现自己有一个使用 windows shell32自动化 的代码 但这需要提供i
  • Play框架表单只有18个参数

    我观察到 当我向 Play Framework Form class 添加超过 18 个参数时 我会收到一个很长 对我来说难以理解 的编译错误 这是有记录的限制吗 我需要在表单帖子中接收多达 29 个参数 我不决定参数的设计和数量 因为我正
  • 如何将结构体成员设为私有?

    我在头文件中定义了一个结构 如下所示 typedef struct void data point 我想阻止其他人直接访问 data 所以我想我应该在 c 文件中声明结构并使用类似的东西extern typedef struct point
  • 模板中的 Django settings.py 变量

    我遇到了一个非常奇怪的错误 我在我的应用程序中定义了一个应用程序IDsettings py像这样的文件 CARDSPRING APP ID 这几乎适用于我网站上的每个页面 除了一个页面 奇怪的是 其他变量也起作用 在页面的脚本部分中 我有以
  • Android.mk - 构建目录中的所有源文件

    我正在使用 Android NDK 构建我的 cocos2dx 项目 在 Android mk 中 有一个 LOCAL SRC FILES 的定义 其中列出了每个 cpp 文件 每当我添加新的源文件时 我也需要将它添加到那里 它看起来像这样
  • SQL:如何为每天的每个组选择最大值?

    假设我有一个包含以下列的表 Name Date Number 并假设我们将以下数据插入到这些列中 Bob 2011 11 22 1 Bob 2011 11 22 5 Bob 2011 11 22 4 Bob 2011 11 22 3 Wen
  • 自动更新的 iOS 应用程序,用于企业分发

    是否有可能制作一个iOS应用企业分布透明地自我更新 说 更新 我的意思是完全更新其逻辑 这种方法的一个可能用途是远程维护的自助服务亭 iPad 不可能直接更新应用程序二进制文件 但我看到了一些可能性 具有单个 UIWebView 且逻辑在
  • 如何像 Facebook 上那样在 div 外部制作可滚动的 DIV 并带有滚动条?

    我想要一个可滚动的 div 但默认情况下滚动条应该位于浏览器的右侧 但不在 div 的右侧 我在 facebook 上看到过 ceter div contentArea 由右侧浏览器滚动条滚动 Facebook 的做法是让所有不滚动的内容都
  • Rails 单表继承 - 显式设置类型的最佳方法是什么?

    我在用单表继承在我的 Rails 应用程序中 并且想要显式设置实例的类型 我有以下内容 class Event lt ActiveRecord Base class SpecialEvent lt Event 它是通过单表继承来实现的 Sp
  • 我可以使用二进制在汇编中写入整数常量吗?

    我有一个作业要求定义 4 个整数 每个整数都有不同的字节长度 1 2 4 8 这段代码可以工作吗 segment data one db 1 two dw 01 four dd 1011 eight dq 01101110 global s
  • 我可以检测用户何时使用后退按钮进入页面吗?

    Edit 我真正需要知道的是 当用户通过后退按钮到达页面时 是否有任何 javascript 事件能够可靠地触发 我尝试过onload活动为body元素 但它不会在 Firefox 或 Safari 上触发 我正在使用一些旧代码 这些代码试
  • MongoDB E11000重复键错误

    我有一个模型在第一次发布后不断出错 我正在创建一个调度应用程序 该应用程序有 X 天 包含房间和房间的时间段 我遇到的问题是在数据库中创建日期对象 为了便于阅读 我只需要一个键值对 day model js var mongoose req
  • 现代 C++ 方法重复代码设定次数

    很简单 是否有一种更简单的方法来重复一个块一定次数 其中块内部不需要计数器变量 简单的解决方案当然是 for int i 0 i lt repetitions i do your thing i is not used here 然而 既然
  • 全局字典不需要关键字global来修改吗? [复制]

    这个问题在这里已经有答案了 我想知道为什么我可以更改全局字典而不用global关键词 为什么其他类型必须这样做 这背后有什么逻辑吗 例如 代码 usr bin env python3 stringvar mod dictvar key1 1
  • 从返回堆栈恢复的片段

    我正在使用兼容包来将 Fragment 与 Android 2 2 一起使用 当使用片段并将它们之间的转换添加到后台堆栈时 我希望实现与活动的 onResume 相同的行为 即每当片段弹出后被带到 前台 对用户可见 时backstack 我
  • Bash,不同文件测试的令人困惑的结果(test -f)

    我在 bash 中对这个表达式感到困惑 var empty var test f var echo test if such file exists 0 and this file exists amazing test f echo le
  • 在 Django 中合并两个具有相同主键的不相关表/模型

    我有两个具有相同主键的不相关表 ip mac 11 11 11 11 48 C0 09 1F 9B 54 33 33 33 33 4E 10 A3 BC B8 9D 44 44 44 44 CD 00 60 08 56 2A 55 55 5
  • flutter:NoSuchMethodError:在 null 上调用 getter 'isEmpty'

    我正在调用 Web API 并接收配置文件模型作为响应 当我使用下面的代码时 它会抛出一个错误 try if profile message isEmpty Navigator of context pushNamed home else
  • 将字符串拆分为多个不同的字符

    我想使用一个或多个分隔符来分割字符串 例如 a b c 拆分为 和 将给出列表 a b c 目前 我在标准库中看不到任何东西可以做到这一点 而且我自己的尝试有点笨拙 例如 def my split string split chars if
  • Flutter SliverAppBar 与选项卡覆盖内容

    我已经遵循了这个教程 https medium com diegovoper flutter collapsing toolbar sliver app bar 14b858e87abe 创建带有 TabBar 的折叠工具栏 问题是 当我滚