Flutter自定义滚动条插件detached_scrollbar的使用

Flutter自定义滚动条插件detached_scrollbar的使用

安装 💻

为了开始使用Detached Scrollbar,您必须在机器上安装Flutter SDK。

通过以下命令添加插件:

dart pub add detached_scrollbar

持续集成 🤖

Detached Scrollbar 配备了一个由 Very Good Workflows 支持的 GitHub Actions 工作流。您也可以添加您喜欢的 CI/CD 解决方案。默认情况下,每次拉取请求和推送时,CI 会格式化、检查代码并运行测试。这确保了代码的一致性和正确性。项目使用 Very Good Analysis 进行严格的分析选项设置。代码覆盖率使用 Very Good Workflows 进行强制执行。

运行测试 🧪

对于新用户,安装 very_good_cli:

dart pub global activate very_good_cli

运行所有单元测试:

very_good test --coverage

生成覆盖率报告:

genhtml coverage/lcov.info -o coverage/

打开覆盖率报告:

open coverage/index.html

发布步骤

  1. 更新 pubspec.yaml 中的版本。
  2. 运行 dart pub publish

使用示例

以下是一个简单的示例,展示了如何使用 detached_scrollbar 插件来创建一个带有自定义滚动条的应用程序。

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

void main() {
  runApp(const TestPage());
}

class TestPage extends StatelessWidget {
  const TestPage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const TestView();
  }
}

class TestView extends StatefulWidget {
  const TestView({super.key});

  [@override](/user/override)
  State<TestView> createState() => _TestViewState();
}

class _TestViewState extends State<TestView> {
  final ScrollController _horizontalController = ScrollController();
  final ScrollController _verticalController = ScrollController();

  [@override](/user/override)
  void dispose() {
    _horizontalController.dispose();
    _verticalController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    final tableHeight = MediaQuery.of(context).size.height * 0.8;
    final tableWidth = MediaQuery.of(context).size.width * 0.8;
    final xTrackLength = MediaQuery.of(context).size.width * 0.5;
    final yTrackLength = MediaQuery.of(context).size.height * 0.5;

    // 表格内容
    final table = ScrollConfiguration(
      behavior: const ScrollBehavior().copyWith(scrollbars: false),
      child: SingleChildScrollView(
        controller: _verticalController,
        child: SingleChildScrollView(
          controller: _horizontalController,
          scrollDirection: Axis.horizontal,
          child: DataTable(
            columns: List.generate(
              20,
              (index) => DataColumn(label: Text('Header $index')),
            ),
            rows: List.generate(
              100,
              (index) => DataRow(
                cells: List.generate(
                  20,
                  (cellIndex) => DataCell(Text('Row $index Cell $cellIndex')),
                ),
              ),
            ),
          ),
        ),
      ),
    );

    // 自定义水平滚动条
    final horizontalScrollbar = DetachedScrollBar(
      scrollController: _horizontalController,
      trackLength: xTrackLength,
    );

    // 自定义垂直滚动条
    final verticalScrollbar = DetachedScrollBar(
      scrollController: _verticalController,
      trackLength: yTrackLength,
      isHorizontal: false,
    );

    return Scaffold(
      appBar: AppBar(title: const Text('自定义Detached滚动条')),
      body: Container(
        padding: const EdgeInsets.all(16),
        child: Center(
          child: Stack(
            children: [
              SizedBox(
                height: tableHeight,
                width: tableWidth,
                child: table,
              ),
              Align(
                alignment: Alignment.bottomLeft,
                child: horizontalScrollbar,
              ),
              // 如果禁用此,则水平滚动条将缩小
              Align(
                alignment: Alignment.topRight,
                child: verticalScrollbar,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter自定义滚动条插件detached_scrollbar的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义滚动条插件detached_scrollbar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


detached_scrollbar 是一个 Flutter 插件,用于在滚动视图(如 ListViewGridView 等)中实现自定义的滚动条。与 Flutter 自带的 Scrollbar 组件不同,detached_scrollbar 允许你将滚动条与滚动内容分离,从而实现更灵活的 UI 设计。

以下是 detached_scrollbar 的基本使用方法:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 detached_scrollbar 依赖:

dependencies:
  flutter:
    sdk: flutter
  detached_scrollbar: ^1.0.0  # 请使用最新版本

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

2. 使用 DetachedScrollbar

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

class ScrollableList extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Detached Scrollbar Example'),
      ),
      body: DetachedScrollbar(
        child: ListView.builder(
          itemCount: 50,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text('Item $index'),
            );
          },
        ),
      ),
    );
  }
}

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

3. 自定义滚动条样式

你可以通过 DetachedScrollbarscrollbar 参数来自定义滚动条的样式。例如:

DetachedScrollbar(
  scrollbar: Container(
    width: 10,
    decoration: BoxDecoration(
      color: Colors.blue.withOpacity(0.5),
      borderRadius: BorderRadius.circular(5),
    ),
  ),
  child: ListView.builder(
    itemCount: 50,
    itemBuilder: (context, index) {
      return ListTile(
        title: Text('Item $index'),
      );
    },
  ),
)

4. 控制滚动条位置

你可以通过 controller 参数来控制滚动条的位置。例如:

final ScrollController _controller = ScrollController();

DetachedScrollbar(
  controller: _controller,
  child: ListView.builder(
    controller: _controller,
    itemCount: 50,
    itemBuilder: (context, index) {
      return ListTile(
        title: Text('Item $index'),
      );
    },
  ),
)

5. 其他参数

  • position: 控制滚动条的位置,默认为 ScrollbarPosition.right(右侧)。你可以设置为 ScrollbarPosition.left(左侧)。
  • alwaysVisible: 控制滚动条是否始终可见,默认为 false

6. 完整示例

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

class ScrollableList extends StatelessWidget {
  final ScrollController _controller = ScrollController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Detached Scrollbar Example'),
      ),
      body: DetachedScrollbar(
        controller: _controller,
        scrollbar: Container(
          width: 10,
          decoration: BoxDecoration(
            color: Colors.blue.withOpacity(0.5),
            borderRadius: BorderRadius.circular(5),
          ),
        ),
        position: ScrollbarPosition.left,
        alwaysVisible: true,
        child: ListView.builder(
          controller: _controller,
          itemCount: 50,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text('Item $index'),
            );
          },
        ),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: ScrollableList(),
  ));
}
回到顶部