dart - 如何在 Flutter 的 SliverAppBar 中添加 Tabbar?

标签 dart material-design flutter

我们可以在 SliverAppBar 中添加 TabBar 吗?

由于 SliverAppBar 具有 bottom 属性,我认为我们可以在我们的 SliverAppBar 中添加 Tabbar,但问题是 TabBar 需要 DefaultTabbarController 并且 DefaultTabbarController 仅适用于 Material Widget 而 SliverAppbar 仅适用于 Scaffold Body,而不是在我的 appbar 中,但我需要我的脚手架主体有 TabView。什么解释?

最佳答案

是的,您可以使用 NestedScrollView 在 SliverAppBar 中添加 Tabbar。您还可以自定义类似于 whatsapp 的应用栏,即 float 应用栏。请务必为此在 NestedScrollView 中添加 floatHeaderSliv​​ers: true。 Link to working code

import 'dart:math';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: CustomSliverAppbar(),
    );
  }
}

class CustomSliverAppbar extends StatefulWidget {
  @override
  _CustomSliverAppbarState createState() => _CustomSliverAppbarState();
}

class _CustomSliverAppbarState extends State<CustomSliverAppbar>
    with SingleTickerProviderStateMixin {
  TabController _tabController;

  @override
  void initState() {
    _tabController = TabController(
      initialIndex: 0,
      length: 2,
      vsync: this,
    );
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: NestedScrollView(
        floatHeaderSlivers: true,
        headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
          return <Widget>[
            SliverAppBar(
              title: Text(
                "WhatsApp type sliver appbar",
              ),
              centerTitle: true,
              pinned: true,
              floating: true,
              bottom: TabBar(
                  indicatorColor: Colors.black,
                  labelPadding: const EdgeInsets.only(
                    bottom: 16,
                  ),
                  controller: _tabController,
                  tabs: [
                    Text("TAB A"),
                    Text("TAB B"),
                  ]),
            ),
          ];
        },
        body: TabBarView(
          controller: _tabController,
          children: [
            TabA(),
            const Center(
              child: Text('Display Tab 2',
                  style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }
}

class TabA extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scrollbar(
      child: ListView.separated(
        separatorBuilder: (context, child) => Divider(
          height: 1,
        ),
        padding: EdgeInsets.all(0.0),
        itemCount: 30,
        itemBuilder: (context, i) {
          return Container(
            height: 100,
            width: double.infinity,
            color: Colors.primaries[Random().nextInt(Colors.primaries.length)],
          );
        },
      ),
    );
  }
}

enter image description here

关于dart - 如何在 Flutter 的 SliverAppBar 中添加 Tabbar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51277171/

相关文章:

android - "Is there a way to set any object as dynamic as according devices resolution in flutter?"

Flutter GestureDetector(如果向下滑动以关闭)

animation - 带有动画的 Flutter 剪辑 PNG

flutter - 定期通知 - OneSignal API Flutter

android - 使用 xml 菜单在抽屉导航中分隔

dart - 是否允许在聚合物元素中使用任何类型的 @published 属性?

android - Pre-Lollipop 设备上 ImageButton 的提升效果

javascript - 如何增加material-ui图标?

dart - 获取 FutureBuilder 中 Future<Map<String,String>> 的值

xcode - 为什么我收到此错误无法为模拟器构建应用程序。在 iPhone 11 Pro Max 上启动应用程序时出错?