NestedScrollView
各タブで+ SliverAppBar
+TabView
を使用しようとしScrollbar
ていますが、水平方向に滑ると例外が発生します:
AnimationController のステータス リスナーに通知しているときに、次のアサーションがスローされました: PrimaryScrollController は現在、複数の ScrollPosition にアタッチされています。
でラップしようとしましたScrollbar
がPrimaryScrollController
、例外は消えましたが、外側のコントローラーと内側のコントローラーが同期されなくなりました。追加ScrollController
してNestedScrollView
から使用しようとしましNotificationListener
たが、速く滑ると奇妙なラグが発生しました:
NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification notification) {
//print(notification.metrics.axisDirection);
if (notification.metrics.extentAfter > 0 &&
notification.metrics.extentBefore > 0 &&
notification.metrics.axisDirection == AxisDirection.down) {
double pixelnow = notification.metrics.pixels;
double _jmpTo =
_scrollController.offset + (pixelnow - _scrollLocation);
//print("pixel now : $pixelnow");
//print("jumpto: $_jmpTo");
if (_scrollController.position.maxScrollExtent >= _scrollController.offset
&& _scrollController.offset >= _scrollController.position.minScrollExtent ){
_scrollController.jumpTo(_jmpTo);
//_scrollController.jumpTo(value)
}
_scrollLocation = pixelnow;
}
return false;
},
私の元のコードはここにあります:
import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(home: Scaffold(body: CommunityPage())));
class CommunityPage extends StatefulWidget {
CommunityPage({Key? key}) : super(key: key);
@override
_CommunityPageState createState() => _CommunityPageState();
}
class _CommunityPageState extends State<CommunityPage> {
//ScrollController _scrollController = ScrollController();
//final TabController _tabController = TabController();
final _tabs = <String>["Tab 1", "Tab 2", "Tab 3"];
@override
Widget build(BuildContext context) {
return Scaffold(
body: DefaultTabController(
length: _tabs.length, // This is the number of tabs.
child: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
// These are the slivers that show up in the "outer" scroll view.
return <Widget>[
SliverOverlapAbsorber(
handle:
NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver: SliverAppBar(
automaticallyImplyLeading: false,
title: const Text("Community",style: TextStyle(color: Colors.black)),
//centerTitle: false,
pinned: true,
floating: true,
snap: true,
backgroundColor: Colors.grey[50],
expandedHeight: 85.0,
bottom: TabBar(
tabs: _tabs.map((String name) => Tab(text: name)).toList(),
),
),
),
];
},
body: TabBarView(
children: _tabs.map((String name) {
return Builder(
builder: (BuildContext context) {
return Scrollbar(
child: CustomScrollView(
key: PageStorageKey<String>(name),
slivers: <Widget>[
SliverOverlapInjector(
handle:
NestedScrollView.sliverOverlapAbsorberHandleFor(
context),
),
SliverFixedExtentList(
itemExtent: 50.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return ListTile(
title: Text('Item $index'),
);
},
childCount: 30,
),
),
],
),
);
},
);
}).toList(),
),
),
),
);
}
}
私があきらめたとき、すべてがOKで、うまく機能していてScrollbar
も、本当に混乱しています...RefreshIndicator