документ флаттера показывает демо для SliverAppBar
+ TabBar
+ TabBarView with ListView
использования NestedScrollView
, и это немного сложно, поэтому мне интересно, есть ли простой и понятный способ реализацииЭто.Я попытался это:
CustomScrollView
slivers:
SliverAPPBar
bottom: TabBar
TabBarView
children: MyWidget(list or plain widget)
получил ошибку:
flutter: было выброшено следующее утверждение при построении Scrollable (axisDirection: right, физика:
flutter: A 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');
}),
),
],
),
);
}
}
и для официальной демонстрации используется structкак это
DefaultTabController
NestedScrollView
headerSliverBuilder
SliverOverlapAbsorber
handle
SliverAppBar
TabBarView
CustomScrollView
SliverOverlapInjector
handle
SliverPadding