一尘不染

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

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保存当前滚动偏移量,如果重新创建了此控制器的可滚动内容,则将其恢复。[…] 最后


阅读 604

收藏
2020-08-13

共1个答案

一尘不染

这是因为您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),
        ),
2020-08-13