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

时间:2019-01-01 21:39:47

标签: dart 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
}

This answer建议使用将ScrollController设置为keepScrollOffset的自定义true,但这是默认值,并且将其显式设置为true因此改变任何东西。

2 个答案:

答案 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

我希望这也能帮助其他面临同样问题的人...