我有一个ExpansionPanelList里面SingleChildScrollView。每当我(展开)一个面板并调用时setState,SingleChildScrollView滚动条就会回到顶部。我该如何预防?
ExpansionPanelList
SingleChildScrollView
setState
@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 }
这个答案建议使用自定义ScrollController与keepScrollOffset设置为true,然而,这是默认值,并明确将其设置为true因此不会改变任何东西。
ScrollController
keepScrollOffset
true
我建议在构造SingleChildScrollView小部件时通过自定义ScrollController。
ScrollController具有一个名为“ keepScrollOffset”的属性,您需要将其设置为true。
从位于https://docs.flutter.io/flutter/widgets/ScrollController-class.html的文档中
keepScrollOffset→bool每次滚动完成时,请使用PageStorage保存当前滚动偏移量,如果重新创建了此控制器的可滚动内容,则将其恢复。[…] 最后
这是因为您Key每次重建窗口小部件(setState)时都会使用新的。
Key
要解决您的问题,只需将下面的代码移到build方法之外
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), ),