Flutter可滚动列表标签滚动插件scrollable_list_tab_scroller的使用

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

Flutter可滚动列表标签滚动插件scrollable_list_tab_scroller的使用

scrollable_list_tab_scroller

scrollable_list_tab_scroller 是一个可定制的Flutter小部件,它将一组可滚动的项目与选项卡同步。您可以创建自定义选项卡,这些选项卡与内部ScrollView同步。选项卡跟随ScrollView的索引,反之亦然。

Demo

安装

在您的 pubspec.yaml 文件中添加依赖项:

dependencies:
    scrollable_list_tab_scroller: ^latest_version # 请替换为最新版本号

使用方法

ScrollableListTabScroller

参数 定义
int itemCount 将要构建的项目数量。
IndexedWidgetBuilder itemBuilder 列表项的构造器。
IndexedActiveStatusWidgetBuilder tabBuilder 带有活动状态的选项卡构造器,用于自定义。
HeaderContainerBuilder? headerContainerBuilder 可选的头部容器构造器,用于自定义。
BodyContainerBuilder? bodyContainerBuilder 可选的身体容器构造器,用于自定义。
ItemScrollController? itemScrollController 可选的项目列表控制器。
ItemPositionsListener? itemPositionsListener 可选的项目列表位置监听器。
void Function(int)? tabChanged 可选的选项卡更改监听器。
double earlyChangePositionOffset 可选的垂直偏移量,在列表项到达边缘之前更改索引(默认 = 0)。
Duration animationDuration 可选的动画持续时间。
其他参数 可选的 scrollable_positioned_list 的参数

如果您不想使用构建器构建自己的 HeaderContainer,可以使用 ScrollableListTabScroller.defaultComponents() 构造函数,它提供了额外的属性来自定义默认的头部容器和选项卡栏。

示例代码

下面是一个完整的示例代码,展示了如何使用 scrollable_list_tab_scroller 插件来创建一个带有可滚动选项卡的列表视图。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Scrollable List Tab Scroller',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Scrollable List Tab Scroller'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final data = {
    "Category A": [
      "Item 1 (A)",
      "Item 2 (A)",
      "Item 3 (A)",
      "Item 4 (A)",
    ],
    "Category B": [
      "Item 1 (B)",
      "Item 2 (B)",
    ],
    "Category C": [
      "Item 1 (C)",
      "Item 2 (C)",
      "Item 3 (C)",
      "Item 4 (C)",
      "Item 5 (C)",
    ],
    "Category D": [
      "Item 1 (D)",
      "Item 2 (D)",
      "Item 3 (D)",
      "Item 4 (D)",
      "Item 5 (D)",
      "Item 6 (D)",
      "Item 7 (D)",
      "Item 8 (D)",
      "Item 9 (D)",
    ],
  };

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ScrollableListTabScroller.defaultComponents(
        headerContainerProps: HeaderContainerProps(height: 50),
        tabBarProps: TabBarProps(dividerColor: Colors.red.withOpacity(0.3)),
        itemCount: data.length,
        earlyChangePositionOffset: 30,
        tabBuilder: (BuildContext context, int index, bool active) => Padding(
          padding: EdgeInsets.symmetric(horizontal: 10),
          child: Text(
            data.keys.elementAt(index),
            style: !active
                ? null
                : TextStyle(fontWeight: FontWeight.bold, color: Colors.green),
          ),
        ),
        itemBuilder: (BuildContext context, int index) => Column(
          children: [
            Text(
              data.keys.elementAt(index),
              style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
            ),
            ...data.values
                .elementAt(index)
                .asMap()
                .map(
                  (index, value) => MapEntry(
                    index,
                    ListTile(
                      leading: Container(
                        height: 40,
                        width: 40,
                        decoration: BoxDecoration(
                            shape: BoxShape.circle, color: Colors.grey),
                        alignment: Alignment.center,
                        child: Text(index.toString()),
                      ),
                      title: Text(value),
                    ),
                  ),
                )
                .values
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个包含多个类别的数据映射,并使用 ScrollableListTabScroller.defaultComponents 来构建带有选项卡的可滚动列表。每个选项卡对应一个类别,点击选项卡或滚动列表时,它们会自动同步。

许可证

本项目采用MIT许可证,更多关于许可证的信息可以在这里找到。

希望这个插件能帮助您更轻松地实现复杂的UI交互效果!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是如何在Flutter项目中使用scrollable_list_tab_scroller插件的一个示例代码案例。这个插件允许你创建一个可滚动的标签页列表,其中每个标签页都对应一个可滚动的视图。

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

dependencies:
  flutter:
    sdk: flutter
  scrollable_list_tab_scroller: ^latest_version  # 请使用最新版本号

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

接下来,在你的Flutter项目中,你可以使用以下代码来创建一个带有可滚动标签页的列表:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ScrollableListTabScrollerExample(),
    );
  }
}

class ScrollableListTabScrollerExample extends StatefulWidget {
  @override
  _ScrollableListTabScrollerExampleState createState() => _ScrollableListTabScrollerExampleState();
}

class _ScrollableListTabScrollerExampleState extends State<ScrollableListTabScrollerExample> with SingleTickerProviderStateMixin {
  late TabController _tabController;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 5, vsync: this);
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Scrollable List Tab Scroller Example'),
      ),
      body: ScrollableListTabScroller(
        tabController: _tabController,
        tabBar: TabBar(
          isScrollable: true,
          labelColor: Colors.blue,
          unselectedLabelColor: Colors.grey,
          tabs: List.generate(5, (index) {
            return Tab(
              text: "Tab ${index + 1}",
            );
          }),
        ),
        tabContentBuilder: (context, index) {
          return ListView.builder(
            itemCount: 20,
            itemBuilder: (context, itemIndex) {
              return ListTile(
                title: Text("Item ${(index * 20) + itemIndex + 1}"),
              );
            },
          );
        },
      ),
    );
  }
}

代码说明:

  1. 依赖引入:在pubspec.yaml文件中添加scrollable_list_tab_scroller依赖。

  2. 主应用入口MyApp类定义了应用的入口,并设置了主页为ScrollableListTabScrollerExample

  3. 状态管理ScrollableListTabScrollerExample是一个有状态的组件,它使用TabController来管理标签页的切换。

  4. 初始化状态:在initState方法中初始化TabController

  5. 释放资源:在dispose方法中释放TabController资源。

  6. 构建UI

    • 使用Scaffold作为布局的基础。
    • AppBar包含应用的标题。
    • ScrollableListTabScroller是主要的组件,它包含了一个可滚动的标签栏(TabBar)和一个内容构建器(tabContentBuilder)。
    • TabBar设置了标签页是否可滚动、标签的颜色等属性。
    • tabContentBuilder是一个函数,它根据当前选中的标签页索引构建对应的内容。这里每个标签页的内容是一个包含20个ListTileListView

通过这个示例,你可以创建一个带有可滚动标签页的列表,每个标签页对应一个可滚动的视图。希望这个示例对你有所帮助!

回到顶部