https://youtu.be/3Cm7WzH3gb8

ер документ показываетдемонстрация заSliverAppBar + TabBar + TabBarView with ListView использованиеNestedScrollViewи это немного сложно, поэтому мне интересно, есть ли простой и понятный способ реализовать это. Я попробовал это:

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

получил ошибку:

flutter: было выброшено следующее утверждение при построении Scrollable (axisDirection: right, физика:
flutter: RenderViewport ожидал дочерний тип RenderSliver, но получил дочерний тип _RenderExcludableScrollSemantics.
flutter: RenderObjects ожидает определенных типов дочерних элементов, потому что они координируют свои действия с дочерними элементами во время разметки и рисования. Например, RenderSliver не может быть дочерним элементом RenderBox, потому что RenderSliver не понимает протокол компоновки RenderBox.

а также

flutter: было сгенерировано другое исключение: 'package: flutter / src / widgets / framework.dart': ошибочное утверждение: строка 3497, позиция 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

Ответы на вопрос(2)

Ваш ответ на вопрос