flutter - SliverAppBar() 不会与 Flutter 中的 ListView 折叠

标签 flutter dart flutter-sliver

我正在尝试为 SliverAppBar() 中的每个主选项卡(嵌套选项卡栏)显示选项卡.它看起来像这样:

See the image

See the GIF

考试标签的内容在 Container()小部件(图像中的错误来自)。
现在,有了 Container()小部件 SliverAppBar()当用户滚动检查选项卡内容(图像中的白屏)时会崩溃,现在一切正常。

所以,在我更换了 Container() 之后与 ListView.builder()使选项卡内容可滚动,现在我无法折叠 SliverAppBar()从选项卡内容(图像中的白屏)。但我可以从SliverAppBar() .

See this GIF after I added ListView.builder()

那么,如何使用 Listview 使 SliverAppBar 可滚动(折叠)?
可以任何人帮助 我?请 :(

这个例子(演示):

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(title: 'SliverAppBar App Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: DefaultTabController(
          length: 2,
          child: NestedScrollView(
            headerSliverBuilder:
                (BuildContext context, bool innerBoxIsScrolled) {
              return [
                SliverOverlapAbsorber(
                  handle:
                      NestedScrollView.sliverOverlapAbsorberHandleFor(context),
                  child: SliverSafeArea(
                    top: false,
                    sliver: SliverAppBar(
                      pinned: true,
                      title: Text(widget.title),
                      expandedHeight: 500,
                    ),
                  ),
                ),
                SliverPersistentHeader(
                  delegate: _SliverAppBarDelegate(
                    TabBar(tabs: [Tab(text: 'Tab A'), Tab(text: 'Tab B')]),
                    Colors.blue,
                  ),
                  pinned: false,
                ),
              ];
            },
            body: TabBarView(
              children: <Widget>[
                NestedTabs('A'),
                NestedTabs('B'),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

// This class is to handle the main tabs (Tab A & Tab B)
class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
  _SliverAppBarDelegate(this._tabBar, this._color);

  TabBar _tabBar;
  final Color _color;

  @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(
      color: _color,
      alignment: Alignment.center,
      child: _tabBar,
    );
  }

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

class NestedTabs extends StatelessWidget {
  final String mainTabName;
  NestedTabs(this.mainTabName);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: PreferredSize(
        preferredSize: Size.fromHeight(20),
        child: Container(
          color: Colors.blue,
          alignment: Alignment.bottomCenter,
          child: TabBar(
            tabs: [
              Tab(text: 'Tab $mainTabName-1'),
              Tab(text: 'Tab $mainTabName-2')
            ],
          ),
        ),
      ),
      body: TabBarView(
        children: [
          ListView.builder(
            padding: const EdgeInsets.all(8),
            itemCount: 500,
            itemBuilder: (BuildContext context, int index) {
              return Container(
                  height: 50,
                  width: 200,
                  color: Colors.black45,
                  child: Center(child: Text('Index ${index}')));
            },
          ),
          ListView.builder(
            padding: const EdgeInsets.all(8),
            itemCount: 500,
            itemBuilder: (BuildContext context, int index) {
              return Container(
                  height: 50,
                  width: 200,
                  color: Colors.black45,
                  child: Center(child: Text('Index ${index}')));
            },
          )
        ],
      ),
    );
  }
}



谢谢 :)

最佳答案

对 ListView 使用 SliverList() 而不是 SliverFillRemaining

关于flutter - SliverAppBar() 不会与 Flutter 中的 ListView 折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59778387/

相关文章:

dart - 如何添加 Flutter DropdownButtonFormField

types - 在声明局部变量时,最好在Dart中声明类型或只使用 `var`?

flutter - 如何在 Flutter 中创建底部评论小部件?

flutter - 在CustomScrollView中检测项目退出 View

dart - 文本字段更新不适用于 flutter_masked_text

dart - setState() 如何重建子部件?

dart - Flutter中的文件列表

flutter - Flutter_bloc软件包中的FutureBuilder和快照

flutter - Flutter 中的主屏幕小部件

flutter - Navigator.push可以和Flutter三元一起使用吗