问题描述
创建父滚动控制器,并将其分配给nestedScrollView。并且为每个选项卡的CustomScrollView创建子滚动控制器。这是变量,控制器是通过init方法创建的:
static const tabs = ['One','Two','Three','Four'];
TabController _tabController;
ScrollController _parentScrollController;
Map<String,ScrollController> _childScrollController = Map();
这是构建方法:
@override
Widget build(BuildContext context) {
return Refreshindicator(
onRefresh: () async => await Future.delayed(const Duration(seconds: 1)),child: nestedScrollView(
controller: _parentScrollController,headerSliverBuilder: (BuildContext context,bool innerBoxIsScrolled) {
return <Widget>[
SliverOverlapAbsorber(
handle: nestedScrollView.sliverOverlapAbsorberHandleFor(context),sliver: SliverAppBar(
backgroundColor: Colors.green,title: const Text('Tabs with explicit scroll controllers'),actions: [],pinned: true,expandedHeight: 200.0,forceElevated: innerBoxIsScrolled,bottom: TabBar(
controller: _tabController,tabs: tabs
.map<Widget>((String page) => Tab(text: page))
.toList(),),];
},body: TabBarView(
controller: _tabController,children: tabs.map<Widget>((String page) {
return SafeArea(
top: false,bottom: false,child: Builder(
builder: (BuildContext context) {
return CustomScrollView(
// If the controller below is set,AppBar or other header slivers dont expand or collapse
// If I remove it,I get the desired effect
controller: _childScrollController[page],key: PageStorageKey<String>(page),slivers: <Widget>[
SliverOverlapInjector(
handle: nestedScrollView.sliverOverlapAbsorberHandleFor(
context),SliverFixedExtentList(
itemExtent: 100,delegate: SliverChildBuilderDelegate(
(BuildContext context,int index) {
return Container(
alignment: Alignment.center,color: index % 2 == 0
? Colors.deepPurple[50]
: Colors.blue[100],child: Text("Item $index"),);
},childCount: 100,],);
},);
}).toList(),);
}
我之所以假设它是因为两个滚动控制器之间没有直接关系。我尝试为孩子使用PrimaryScrollController.of(context)
,但是我需要从外部或在初始位置修改滚动位置。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)