首页 文章

如何使用tabBar实现sliverAppBar

提问于
浏览
3

flutter文件显示 SliverAppBar TabBar TabBarView with ListView 使用 NestedScrollView ,它有点复杂,所以我想知道是否有一种简单明了的方法来实现它 . 我试过这个:

CustomScrollView
  slivers:
    SliverAPPBar
      bottom: TabBar
    TabBarView
      children: MyWidget(list or plain widget)

得到错误:

flutter:抛出以下断言构建Scrollable(axisDirection:右,物理:flutter:RenderViewport期望RenderSliver类型的子类但是接收了_RenderExcludableScrollSemantics类型的子类.flutter:RenderObjects期望特定类型的子节点,因为它们在子节期间与子节点协调例如,RenderSliver不能是RenderBox的子项,因为RenderSliver不理解RenderBox布局协议 .

flutter:抛出了另一个异常:'package:flutter / src / widgets / framework.dart':断言失败:第3497行pos 14:'owner._debugCurrentBuildTarget == this':不是真的 .

这是我的代码:

import 'package:flutter/material.dart';

main(List<String> args) {
  runApp(MyScrollTabListApp());
}

class MyScrollTabListApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(title: "aa", home: MyScrollTabListHomePage());
  }
}

class MyScrollTabListHomePage extends StatefulWidget {
  @override
  MyScrollTabListHomePageState createState() {
    return new MyScrollTabListHomePageState();
  }
}

class MyScrollTabListHomePageState extends State<MyScrollTabListHomePage>
    with SingleTickerProviderStateMixin {
  final int _listItemCount = 300;
  final int _tabCount = 8;
  TabController _tabController;

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        slivers: <Widget>[
          SliverAppBar(
            expandedHeight: 240.0,
            title: Text("Title"),
            pinned: true,
            bottom: TabBar(
              controller: _tabController,
              isScrollable: true,
              tabs: List<Tab>.generate(_tabCount, (int i) {
                return Tab(text: "TAB$i");
              }),
            ),
          ),
          TabBarView(
            controller: _tabController,
            children: List<Widget>.generate(_tabCount, (int i) {
              return Text('line $i');
            }),
          ),
        ],
      ),
    );
  }
}

对于官方演示,它使用这样的结构

DefaultTabController
    NestedScrollView
      headerSliverBuilder
        SliverOverlapAbsorber
          handle
          SliverAppBar
        TabBarView
          CustomScrollView
            SliverOverlapInjector
              handle
              SliverPadding

1 回答

  • 2

    以下是使用SilverAppBar的TabView示例

    class SilverAppBarWithTabBarScreen extends StatefulWidget {
      @override
      _SilverAppBarWithTabBarState createState() => _SilverAppBarWithTabBarState();
    }
    
    class _SilverAppBarWithTabBarState extends State<SilverAppBarWithTabBarScreen>
        with SingleTickerProviderStateMixin {
      TabController controller;
    
      @override
      void initState() {
        super.initState();
        controller = new TabController(length: 3, vsync: this);
      }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          body: new CustomScrollView(
            slivers: <Widget>[
              new SliverAppBar(
                title: Text("Silver AppBar With ToolBar"),
                pinned: true,
                expandedHeight: 160.0,
                bottom: new TabBar(
                  tabs: [
                    new Tab(text: 'Tab 1'),
                    new Tab(text: 'Tab 2'),
                    new Tab(text: 'Tab 3'),
                  ],
                  controller: controller,
                ),
              ),
              new SliverList(
              new SliverFillRemaining(
            child: TabBarView(
              controller: controller,
              children: <Widget>[
                   Text("Tab 1"),
                   Text("Tab 2"),
                   Text("Tab 3"),
                 ],
                ),
              ),
            ],
          ),
        );
      }
    }
    

相关问题