我使用时NestedScrollView可以很好地自动隐藏AppBar(我想要的一个功能)SliverAppBar。在遇到问题的地方,我将其ListView.Builder用作身体下游组件之一,我需要将其应用于自身ScrollController(或似乎需要在此处应用)。这与NestedScrollView和冲突,我失去了由NestedScrollView和方便处理的appbar的自动隐藏SliverAppBar。
如果我将附加在ScrollController上,NestedScrollView则它将仅跟踪滚动位置直到偏移量80.0,之后,使用更长的ListView,我无法像直接将ScrollController附加到那样正确地设置animateTo ListView.Builder。
这是我的实现的代码片段/ sudo代码:
new Scaffold(
drawer: ...,
body: new NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return [
new SliverAppBar(
title: new Text('Title'),
floating: true,
snap: true
)
]
}
body: new Stack(
children: <Widget>[
new PageView(
children: <Widget>[
new PageView1(implements ListViewBuilder),
new PageView2(implements ListView),
new PageView3(implements ListView),
]
controller: _pageController,
),
new FloatingActionButton
]
)
)
)
class PageView1 extends StateFulWidget {
...//Builder return scrollable with max offset of 2000.0
return new ListView.builder(
itemBuilder: itemBuilder,
itemCount: objects.length,
controller: _scrollController,
);
...
@override
void initState{
scrollController = new scrollController();
scrollController.animateTo(800.0, ....);
}
}
Run Code Online (Sandbox Code Playgroud)
与此有关的一个好地方是PageView2和3的表现很好,因为应用程序栏的自动隐藏功能可实现滚动行为,因为我没有在那里创建ScrollControllers。但是,PageView1的行为不正确,appbar的autoHide中断了。但是,我真的希望能够正确设置animateTo,并且如果不将控制器直接放在ListViewBuilder上就无法这样做。
对更好的实现有什么想法可以帮助我实现这一目标?
更新:我已经更新了实现,以更紧密地遵循NestedScrollView文档。但是,没有运气。看来NestedScrollView上ScrollController的添加仅跟踪SliverAppBar的位置,而ScrollController.jumpTo或animateTo仅跳至最大AppBar(偏移80)
我解决了。这根本不是我期望的那样。我将SliverList移到headerSliverBuilder中,并且按我想要的方式工作。我从这个NestedScrollView示例要点中做到了这一点:https ://gist.github.com/collinjackson/2bc6697d31e6b94ada330ef5e818a36f
按照NestedScrollViewExample进行操作:
将列表视图更改为 SliverList 或 SliverFixedExtentList 并将其包装在安全区域和 CustomScrollView 内:
return SafeArea(
top: false,
bottom: false,
child: Builder(builder: (BuildContext context) => CustomScrollView(
slivers: <Widget>[
return SliverFixedExtentList(
itemExtent: 100.0,
delegate: SliverChildBuilderDelegate(
(BuildContext context, int i) => ChildWidget(items[i]),
childCount: items.length,
),
),
],
)),
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3398 次 |
| 最近记录: |