首页 > 解决方案 > 调用 setState 后如何防止 Flutter 应用滚动到顶部?

问题描述

我有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
}

这个答案建议使用设置为的自定义ScrollControllerkeepScrollOffset但是true这是默认值,并且将其显式设置为true因此不会改变任何内容。

标签: dartflutter

解决方案


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),
        ),

推荐阅读