You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中两个ScrollController偏移值相同问题及独立方案咨询

解决两个ListView滚动位置同步问题

问题出在Flutter的组件状态复用机制上:当你切换flag显示不同ListView时,两个ListView属于同类型组件,且没有唯一标识,Flutter会复用之前组件的滚动状态,导致第二个ListView的位置和第一个同步——哪怕你用了不同的ScrollController。

解决方法很简单,给两个ListView分别设置唯一的GlobalKey,让Flutter能区分它们的状态,这样两个ScrollController就能完全独立工作:

修改后的代码如下:

import 'package:flutter/material.dart';

void main() {
  runApp(OnlineImageExample());
}

class OnlineImageExample extends StatefulWidget {
  @override
  _OnlineImageExampleState createState() => _OnlineImageExampleState();
}

class _OnlineImageExampleState extends State<OnlineImageExample> {
  ScrollController _scrollController1 = ScrollController();
  ScrollController _scrollController2 = ScrollController();
  bool flag = true;
  // 给两个ListView创建唯一的key
  final _listKey1 = GlobalKey();
  final _listKey2 = GlobalKey();

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: InkWell(
            onTap: () {
              setState(() {
                flag = !flag;
              });
            },
            child: Text('scroll example'),
          ),
        ),
        body: Column(
          children: [
            flag
                ? Expanded(
                    child: ListView.builder(
                      key: _listKey1, // 绑定key
                      physics: AlwaysScrollableScrollPhysics(),
                      controller: _scrollController1,
                      itemCount: 30,
                      itemBuilder: (context, index) {
                        return Padding(
                          padding: EdgeInsets.all(10),
                          child: Container(
                            height: 60,
                            width: 20,
                            color: Colors.red,
                            child: Text("$index"),
                          ),
                        );
                      },
                    ),
                  )
                : Expanded(
                    child: ListView.builder(
                      key: _listKey2, // 绑定key
                      physics: AlwaysScrollableScrollPhysics(),
                      controller: _scrollController2,
                      itemCount: 30,
                      itemBuilder: (context, index) {
                        return Padding(
                          padding: EdgeInsets.all(10),
                          child: Container(
                            height: 60,
                            width: 20,
                            color: Colors.blue,
                            child: Text("$index"),
                          ),
                        );
                      },
                    ),
                  ),
          ],
        ),
      ),
    );
  }
}

你也可以在切换flag时手动重置另一个控制器的滚动位置,但用GlobalKey的方法更优雅,完全符合Flutter的组件状态管理逻辑。

内容的提问来源于stack exchange,提问作者pipi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:59:59