当前位置: 首页 > 面试题库 >

同步滚动多个可滚动小部件

牟飞沉
2023-03-14
问题内容

简而言之:

有没有办法将多个可滚动的小部件(例如SingleSchildScrollView)同步在一起?

我只想要2个可滚动项,可以在我滚动一个时滚动另一个。

这样,我可以Stack将它们放在彼此的顶部,而后面的一个可以跟随前面的一个滚动。

或将它们放在另一组中ColumnRow以使它们分开,但仍可以通过滚动其中一个滚动来滚动。

我尝试使用,controller但似乎并没有按照我的想法做。

尝试下面的代码,例如,“ RIGHT”将在“ LEFT”的前面,如果我尝试滚动它们,则只有RIGHT会移动。那么我如何同时将它们一起移动呢?

请不要告诉我将堆栈放在a内ListView,那不是我所需要的。

class _MyHomePageState extends State<MyHomePage> {

  final ScrollController _mycontroller = new ScrollController();

  @override
  Widget build(BuildContext context) {
    body:
      Container(
        height: 100,
        child:
          Stack( children: <Widget>[
            SingleChildScrollView(
              controller: _mycontroller,
              child: Column( children: <Widget>[
                Text('LEFT            '),
                Text('LEFT            '),
                Text('LEFT            '),
                Text('LEFT            '),
                Text('LEFT            '),
                Text('LEFT            '),
              ],)
            ),
            SingleChildScrollView(
              controller: _mycontroller,
              child: Column(children: <Widget>[
                Text('          RIGHT'),
                Text('          RIGHT'),
                Text('          RIGHT'),
                Text('          RIGHT'),
                Text('          RIGHT'),
                Text('          RIGHT'),
              ],)
            ),
          ])
      )
}}

我相信之前在多个论坛中都曾问过这个问题,但没有人对此提出任何结论或解决方案。


问题答案:

我使用他们的管理,以同步多个scrollables offset,利用他们ScrollNotification

这是一个粗略的代码示例:

class _MyHomePageState extends State<MyHomePage> {

  ScrollController _mycontroller1 = new ScrollController(); // make seperate controllers
  ScrollController _mycontroller2 = new ScrollController(); // for each scrollables

  @override
  Widget build(BuildContext context) {
    body:
      Container(
        height: 100,
        child: NotificationListener<ScrollNotification>( // this part right here is the key
          Stack( children: <Widget>[

            SingleChildScrollView( // this one stays at the back
              controller: _mycontroller1,
              child: Column( children: <Widget>[
                Text('LEFT            '),
                Text('LEFT            '),
                Text('LEFT            '),
                Text('LEFT            '),
                Text('LEFT            '),
                Text('LEFT            '),
              ],)
            ),
            SingleChildScrollView( // this is the one you scroll
              controller: _mycontroller2,
              child: Column(children: <Widget>[
                Text('          RIGHT'),
                Text('          RIGHT'),
                Text('          RIGHT'),
                Text('          RIGHT'),
                Text('          RIGHT'),
                Text('          RIGHT'),
              ],)
            ),
          ]),

          onNotification: (ScrollNotification scrollInfo) {  // HEY!! LISTEN!!
            // this will set controller1's offset the same as controller2's
            _mycontroller1.jumpTo(_mycontroller2.offset);

            // you can check both offsets in terminal
            print('check -- offset Left: '+_mycontroller1.offset.toInt().toString()+ ' -- offset Right: '+_mycontroller2.offset.toInt().toString()); 
          }
        )
      )
}}

基本上每个人SingleChildScrollView都有自己的controller。每个controller都有自己的offset价值观。NotificationListener<ScrollNotification>滚动滚动时,使用通知任何移动。

然后对于每个滚动手势(我相信这是一帧一帧的基础),我们可以随意添加jumpTo()命令来设置offset

干杯!!

PS。如果列表的长度不同,则偏移量将不同,并且如果尝试滚动超过其限制,则会收到堆栈溢出错误。确保添加一些异常或错误处理。(即if else等)



 类似资料:
  • 问题内容: 我正在尝试使用以下代码实现两个的同步滚动。 并且说内容相同但大小不同 有了这段代码,我面临两个问题。 1)滚动没有很好地同步,因为div的大小不同。我知道,这是因为我直接设置该值。我需要找到滚动内容的百分比并为另一个计算相应的值。我不确定如何找到实际高度和当前滚动位置。 2)仅在中发现此问题。在firefox中,滚动不像其他浏览器那样平滑。我认为这是因为上面的代码创建了滚动事件的无限循

  • 我有一个元素,它本身有一个滚动条,还有一个单独的,它有一个滚动条。如何使其中一个滚动条与另一个滚动条的位置匹配? 我一直在查找获取滚动条位置的方法。 因为它们都返回不同的值,所以我必须知道它们的最大位置。

  • 我有一个类可以画一些非常简单的图形,比如直线、圆和矩形。线条可以动态扩展,有时当它们扩展到超出分辨率时,如果没有滚动条,就无法看到。因此,我已经将JScrollPane添加到JFrame中,但不幸的是,尽管已经调用了布局管理器,但滚动条还是无法滚动。 这是我所拥有的:-一个绘制组件(线条、矩形、圆形)的类-一个设置JFrame/JScrollPane的类 这是我的GUI类的摘录代码: 通过上面的代

  • 现在的情况是:当内部滚动条滚动到底部时如果继续滚动,外部滚动条不会滚动,需要停顿或者移动鼠标滚动才能触发外层滚动条

  • 问题内容: 我想从索引中获取所有数据。由于项数太大而无法存储,因此我使用了Scroll(很好的功能): 调用时效果很好: 但是,当我多次调用前一个方法时,会得到相同的多次,因此无法并行滚动多次。 我找到了http://elasticsearch-users.115913.n3.nabble.com/Multiple-scrolls- simultanious-td4024191.html ,其中指

  • 问题内容: 我想将2个div的大小设置为特定宽度(即500px)。一个高于另一个水平对齐。 顶部框应隐藏其滚动条,底部框应显示滚动条,并且当​​用户滚动时,我希望顶部框的偏移量更改为底部框的值。因此,当底部DIV水平滚动时,似乎顶部DIV也同时滚动。 我很高兴在Jquery中做到这一点,如果它使过程更容易。 问题答案: $(‘#bottom’).on(‘scroll’, function () {

  • 问题内容: 我希望能够滚动浏览整个页面,但不显示滚动条。 在谷歌浏览器中: 但是Mozilla Firefox和Internet Explorer似乎无法正常工作。 我也在CSS中尝试过: 那确实隐藏了滚动条,但我不能再滚动了。 有什么办法可以删除滚动条,同时仍然可以滚动整个页面? 请仅使用CSS或HTML。 问题答案: 只是测试工作正常。 JavaScript: 由于滚动条的宽度在不同的浏览器中

  • 我正忙着建立一个页面,在那里,比赛的计分室将能够看到现场结果,因为评委们会为每个参赛作品打分。 除此之外(每10秒检查一次更新),还有一个功能可以检查舞台上的当前条目(用绿色标记),这将滚动计分室的块,以始终在页面顶部显示当前条目。 然而,这创造了一个无休止的循环上下滚动的整个时间。 初始滚动工作正常,但由于当前项的位置已更改,jQuery再次向下滚动,使该项现在处于新的偏移量。 我的代码当前如下