Flutter同步滚动控制插件sync_scroll_controller的使用

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

Flutter同步滚动控制插件 sync_scroll_controller 的使用

SyncScrollController 是一个用于保持多个 ScrollController 同步的 Flutter 插件。它与 LinkedScrollController 类似,但提供了初始偏移量参数,并且正在积极维护中。

特性

  • 初始滚动偏移量
  • 接受 Pull Requests

开始使用

在命令行中运行以下命令来添加依赖:

flutter pub add sync_scroll_controller

使用示例

下面是一个完整的示例,展示了如何使用 SyncScrollController 来同步两个水平滚动的 ListView

完整示例代码

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sync Scroll Controller Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Example(),
    );
  }
}

class Example extends StatefulWidget {
  const Example({Key? key}) : super(key: key);

  [@override](/user/override)
  State<Example> createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  late final SyncScrollControllerGroup horizontalControllers;
  late ScrollController rowsControllerHeader;
  late ScrollController rowsControllerBody;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化 SyncScrollControllerGroup 并设置初始偏移量
    horizontalControllers = SyncScrollControllerGroup(
      initialScrollOffset: 100,
    );
    // 添加并获取控制器
    rowsControllerHeader = horizontalControllers.addAndGet();
    rowsControllerBody = horizontalControllers.addAndGet();
  }

  [@override](/user/override)
  void dispose() {
    // 确保在销毁时释放控制器
    rowsControllerHeader.dispose();
    rowsControllerBody.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sync Scroll Controller Demo'),
      ),
      body: Column(
        children: [
          Container(
            height: 100, // 设置固定高度
            child: ListView(
              scrollDirection: Axis.horizontal,
              controller: rowsControllerHeader,
              children: const [
                Text(
                  "Lorem Ipsum is simply dummy header of the printing",
                  style: TextStyle(fontSize: 16),
                ),
                SizedBox(width: 20),
                Text(
                  "Lorem Ipsum is simply dummy header of the printing",
                  style: TextStyle(fontSize: 16),
                ),
              ],
            ),
          ),
          Expanded(
            child: ListView(
              scrollDirection: Axis.horizontal,
              controller: rowsControllerBody,
              children: const [
                Text(
                  "Lorem Ipsum is simply dummy body text of the printing",
                  style: TextStyle(fontSize: 16),
                ),
                SizedBox(width: 20),
                Text(
                  "Lorem Ipsum is simply dummy body text of the printing",
                  style: TextStyle(fontSize: 16),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 sync_scroll_controller 插件来实现 Flutter 中两个滚动视图同步滚动的代码示例。

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

dependencies:
  flutter:
    sdk: flutter
  sync_scroll_controller: ^最新版本号  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,在你的 Dart 文件中,你可以按照以下方式使用 SyncScrollController 来实现同步滚动:

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

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

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

class SyncScrollExample extends StatefulWidget {
  @override
  _SyncScrollExampleState createState() => _SyncScrollExampleState();
}

class _SyncScrollExampleState extends State<SyncScrollExample> {
  late SyncScrollController syncScrollController;

  @override
  void initState() {
    super.initState();
    syncScrollController = SyncScrollController.list(
      controllers: [
        ScrollController(),
        ScrollController(),
      ],
    );
  }

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

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Expanded(
          child: ListView.builder(
            controller: syncScrollController.controllers[0],
            itemCount: 100,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('Item $index - List 1'),
              );
            },
          ),
        ),
        Divider(),
        Expanded(
          child: ListView.builder(
            controller: syncScrollController.controllers[1],
            itemCount: 100,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('Item $index - List 2'),
              );
            },
          ),
        ),
      ],
    );
  }
}

在这个示例中,我们做了以下几步:

  1. 创建一个 SyncScrollController 实例,并为两个 ScrollController 创建一个列表。
  2. initState 方法中初始化 SyncScrollController
  3. dispose 方法中释放 SyncScrollController 以避免内存泄漏。
  4. 使用 ListView.builder 创建两个滚动视图,并将 SyncScrollController 中的控制器分别分配给这两个 ListView

这样,当你滚动任何一个 ListView 时,另一个 ListView 也会同步滚动。sync_scroll_controller 插件内部处理了同步逻辑,使得你可以轻松实现这种功能。

回到顶部