Flutter联动滚动控制插件linked_scroll_controller的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter联动滚动控制插件 linked_scroll_controller 的使用

linked_scroll_controller 是一个用于同步多个可滚动组件(如 ListView, GridView 等)滚动位置的Flutter插件。它支持静态或动态添加滚动控制器,但如果是动态添加,则需要为每个可滚动组件提供唯一的键值以避免滚动偏移不同步的问题。

示例代码

下面是一个简单的示例,展示了如何创建两个并排的 ListView,它们可以同步滚动。

import 'package:flutter/material.dart';
import 'package:linked_scroll_controller/linked_scroll_controller.dart';

void main() {
  runApp(MaterialApp(
    home: LinkedScrollables(),
  ));
}

class LinkedScrollables extends StatefulWidget {
  @override
  _LinkedScrollablesState createState() => _LinkedScrollablesState();
}

class _LinkedScrollablesState extends State<LinkedScrollables> {
  LinkedScrollControllerGroup _controllers;
  ScrollController _letters;
  ScrollController _numbers;

  @override
  void initState() {
    super.initState();
    _controllers = LinkedScrollControllerGroup();
    _letters = _controllers.addAndGet();
    _numbers = _controllers.addAndGet();
  }

  @override
  void dispose() {
    _letters.dispose();
    _numbers.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Linked Scroll Controllers Demo'),
      ),
      body: Directionality(
        textDirection: TextDirection.ltr,
        child: Row(
          children: [
            Expanded(
              child: ListView(
                controller: _letters,
                children: <Widget>[
                  _Tile('Hello A'),
                  _Tile('Hello B'),
                  _Tile('Hello C'),
                  _Tile('Hello D'),
                  _Tile('Hello E'),
                ],
              ),
            ),
            Expanded(
              child: ListView(
                controller: _numbers,
                children: <Widget>[
                  _Tile('Hello 1'),
                  _Tile('Hello 2'),
                  _Tile('Hello 3'),
                  _Tile('Hello 4'),
                  _Tile('Hello 5'),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class _Tile extends StatelessWidget {
  final String caption;

  _Tile(this.caption);

  @override
  Widget build(_) => Container(
        margin: const EdgeInsets.all(8.0),
        padding: const EdgeInsets.all(8.0),
        height: 250.0,
        child: Center(child: Text(caption)),
      );
}

解释

  • 我们首先创建了一个 LinkedScrollControllerGroup 实例 _controllers
  • 使用 _controllers.addAndGet() 方法生成了两个 ScrollController,分别用于控制两个 ListView 的滚动行为。
  • dispose 方法中释放了资源,防止内存泄漏。
  • 最后,在 build 方法中,我们构建了两个 ListView 并设置了各自的 controller 属性。

这样,当您在任何一个 ListView 中滚动时,另一个也会同步滚动,从而实现了联动效果。


更多关于Flutter联动滚动控制插件linked_scroll_controller的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter联动滚动控制插件linked_scroll_controller的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用linked_scroll_controller插件来实现联动滚动的代码示例。linked_scroll_controller插件允许你将多个滚动视图链接在一起,使得一个滚动视图的滚动会同步到另一个滚动视图。

首先,确保你已经在pubspec.yaml文件中添加了linked_scroll_controller依赖:

dependencies:
  flutter:
    sdk: flutter
  linked_scroll_controller: ^x.y.z  # 替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个简单的示例,展示了如何使用linked_scroll_controller来实现两个ListView的联动滚动:

import 'package:flutter/material.dart';
import 'package:linked_scroll_controller/linked_scroll_controller.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Linked Scroll Controller Example'),
        ),
        body: LinkedScrollViewExample(),
      ),
    );
  }
}

class LinkedScrollViewExample extends StatefulWidget {
  @override
  _LinkedScrollViewExampleState createState() => _LinkedScrollViewExampleState();
}

class _LinkedScrollViewExampleState extends State<LinkedScrollViewExample> {
  final LinkedScrollControllerGroup _scrollControllerGroup =
      LinkedScrollControllerGroup();

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Expanded(
          child: ListView.builder(
            controller: _scrollControllerGroup.master,
            itemCount: 100,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('Master Item $index'),
              );
            },
          ),
        ),
        Expanded(
          child: ListView.builder(
            controller: _scrollControllerGroup.slave,
            itemCount: 100,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('Slave Item $index'),
              );
            },
          ),
        ),
      ],
    );
  }

  @override
  void dispose() {
    _scrollControllerGroup.dispose();
    super.dispose();
  }
}

在这个示例中,我们创建了一个LinkedScrollControllerGroup,它包含两个滚动控制器:一个是主控制器(_scrollControllerGroup.master),另一个是从控制器(_scrollControllerGroup.slave)。我们将这两个控制器分别赋给了两个ListView

当滚动主ListView时,从ListView会自动同步滚动,反之亦然。这是因为LinkedScrollControllerGroup内部处理了滚动事件的同步。

请确保在组件销毁时调用dispose方法来释放资源,避免内存泄漏。

这个示例展示了linked_scroll_controller插件的基本用法。根据具体需求,你可以进一步自定义滚动行为或添加更多联动视图。

回到顶部