调用setState后如何防止Flutter应用滚动到顶部?
我有一个ExpansionPanelList
里面SingleChildScrollView
。每当我(展开)一个面板并调用时setState
,SingleChildScrollView
滚动条就会回到顶部。我该如何预防?
@overrideWidget build(BuildContext context) {
final _scaffoldKey = new GlobalKey<ScaffoldState>();
return new Scaffold(
key: _scaffoldKey,
appBar: new AppBar(
title: new Text(widget.title),
),
body: new SingleChildScrollView(
child: new ExpansionPanelList(
children: <ExpansionPanel>[
// panels
],
expansionCallback: (int index, bool isExpanded) {
setState(() {
// toggle expanded
});
},
), // ExpansionPanelList
), // SingleChildScrollView
); // Scaffold
}
这个答案建议使用自定义ScrollController
与keepScrollOffset
设置为true
,然而,这是默认值,并明确将其设置为true
因此不会改变任何东西。
我建议在构造SingleChildScrollView小部件时通过自定义ScrollController。
ScrollController具有一个名为“ keepScrollOffset”的属性,您需要将其设置为true。
从位于https://docs.flutter.io/flutter/widgets/ScrollController-class.html的文档中
keepScrollOffset→bool每次滚动完成时,请使用PageStorage保存当前滚动偏移量,如果重新创建了此控制器的可滚动内容,则将其恢复。[…] 最后
回答:
这是因为您Key
每次重建窗口小部件(setState)时都会使用新的。
要解决您的问题,只需将下面的代码移到build
方法之外
final _scaffoldKey = new GlobalKey<ScaffoldState>();
像这样 :
final _scaffoldKey = new GlobalKey<ScaffoldState>(); @override
Widget build(BuildContext context) {
return new Scaffold(
key: _scaffoldKey,
appBar: new AppBar(
title: new Text(widget.title),
),
以上是 调用setState后如何防止Flutter应用滚动到顶部? 的全部内容, 来源链接: utcz.com/qa/422647.html