我在ExpansionPanelList
中有一个SingleChildScrollView
。每当我打开面板并调用setState
时,SingleChildScrollView
就会滚动回到顶部。我该如何预防?
@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
}
This answer建议使用将ScrollController
设置为keepScrollOffset
的自定义true
,但这是默认值,并且将其显式设置为true
因此改变任何东西。
答案 0 :(得分:1)
那是因为每次重新构建窗口小部件(setState)时,您都在使用新的Key
。
要解决您的问题,只需将下面的代码移至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),
),
答案 1 :(得分:0)
我遇到了同样的问题,不知何故@diegoveloper 的回答对我没有帮助。
我最终做的是在一个独立的 SingleChildScrollView
中分离 StatefulWidget
:这也修复了滚动动画。
然后我的代码变成了类似的东西
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: MyExpansionList(),
...
class MyExpansionListextends StatefulWidget {
@override
_MyExpansionListState createState() => _MyExpansionListState();
}
class _MyExpansionListState extends State<MyExpansionList> {
@override
Widget build(BuildContext context) {
return Scrollbar(
isAlwaysShown: true,
showTrackOnHover: true,
child: SingleChildScrollView(
child: Column(
children: [
ExpansionPanelList(animationDuration: Duration(seconds: 1),
通过这种方式,setState()
只更新了 ExpansionPanelList
/ScrollView
,而不是整个 Scaffold
。
我希望这也能帮助其他面临同样问题的人...