调用setState后如何防止Flutter应用滚动到顶部?

我有一个ExpansionPanelList里面SingleChildScrollView。每当我(展开)一个面板并调用时setStateSingleChildScrollView滚动条就会回到顶部。我该如何预防?

@override

Widget 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

}


这个答案建议使用自定义ScrollControllerkeepScrollOffset设置为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

回到顶部