Flutter滚动增强插件scroll_mate的使用

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

Flutter滚动增强插件scroll_mate的使用

简介

scroll_mate 是一个用于同步多个滚动控制器并定义显示行数的Flutter插件。通过这个插件,你可以轻松实现多个滚动视图的同步滚动,并且可以控制每一屏显示多少行内容。

预览

Example Project

快速开始

scroll_mate 插件允许你处理多个滚动控制器的同步滚动。所有行的滚动会同时开始和结束。你可以决定在屏幕上显示多少行。

功能特性

  • 多个滚动控制器同步工作
  • 可以定义显示的行数
  • 支持泛型类型,并且可以自定义显示的Widget

属性

ScrollMateModel 属性
参数 类型 是否必填 默认值
items List<T> -
builder ScrollMateItem Function(T title, int index) -
lineCount int 2
title Widget SizedBox()
crossAxisAlignment CrossAxisAlignment CrossAxisAlignment.start
crossAxisSpacing double 10
mainAxisSpacing double 20
scrollPadding EdgeInsets EdgeInsets.zero
ScrollMateItem 属性
参数 类型 是否必填 默认值
item Widget -
leftMargin double 0
rightMargin double 0

使用示例

以下是一个完整的示例代码,展示了如何使用 scroll_mate 插件来创建一个包含多个滚动视图的页面,并且这些视图会同步滚动。

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Scroll Mate',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        scaffoldBackgroundColor: Colors.white,
        appBarTheme: const AppBarTheme(
          titleTextStyle: TextStyle(
            fontSize: 20,
            color: Colors.black,
            fontWeight: FontWeight.bold,
          ),
          backgroundColor: Colors.white,
          elevation: 0,
        ),
      ),
      debugShowCheckedModeBanner: false,
      home: const InterestView(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Interests'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            // 标题
            const Padding(
              padding: EdgeInsets.only(bottom: 15, left: 20, top: 15),
              child: Text(
                'Interests',
                style: TextStyle(
                  fontSize: 20,
                  color: Color(0xff4c546d),
                  fontWeight: FontWeight.bold,
                ),
              ),
            ),
            // 滚动视图
            Expanded(
              child: ScrollMateList<String>(
                scrollMateModel: ScrollMateModel(
                  lineCount: 4, // 每屏显示4行
                  items: Interests.list, // 数据源
                  title: buildInterestTitle(), // 自定义标题
                  builder: (String title, int index) {
                    return ScrollMateItem(
                      rightMargin: 20, // 右边距
                      leftMargin: 20, // 左边距
                      item: ScrollMateChip(
                        title: title.toString(), // 显示的文本
                        index: index, // 索引
                      ),
                    );
                  },
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  // 构建兴趣标题
  Widget buildInterestTitle() {
    return const SizedBox(
      height: 40,
      child: Center(
        child: Text(
          'Your Interests',
          style: TextStyle(
            fontSize: 18,
            fontWeight: FontWeight.bold,
            color: Colors.grey,
          ),
        ),
      ),
    );
  }
}

// 自定义的ScrollMateItem
class ScrollMateChip extends StatelessWidget {
  final String title;
  final int index;

  const ScrollMateChip({super.key, required this.title, required this.index});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      height: 40,
      padding: const EdgeInsets.symmetric(horizontal: 20),
      alignment: Alignment.center,
      decoration: BoxDecoration(
        color: const Color(0xff4c546d),
        borderRadius: BorderRadius.circular(10),
      ),
      child: Text(
        title,
        style: const TextStyle(
          color: Colors.white,
          fontWeight: FontWeight.bold,
        ),
      ),
    );
  }
}

// 模拟的兴趣列表数据
class Interests {
  static List<String> list = [
    'Reading',
    'Traveling',
    'Cooking',
    'Gaming',
    'Photography',
    'Music',
    'Sports',
    'Programming',
    'Art',
    'Dancing',
  ];
}

其他用法

你还可以创建自己的滚动控制器组件。只需要在 initState 中调用 ScrollMateController.instance.initController 方法,并传入你需要同步的 ScrollController 列表。

final scrollController = ScrollController();
final scrollController2 = ScrollController();

[@override](/user/override)
void initState() {
  super.initState();
  ScrollMateController.instance.initController(
    scrollControllers: [scrollController, scrollController2],
  );
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用scroll_mate插件的一个示例。scroll_mate是一个增强Flutter滚动体验的插件,它提供了一些高级功能来处理滚动视图。

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

dependencies:
  flutter:
    sdk: flutter
  scroll_mate: ^最新版本号  # 请替换为实际最新版本号

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

接下来是一个简单的示例,演示如何使用scroll_mate来创建一个带有粘性头部和底部导航栏的滚动视图。

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

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

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

class ScrollMateDemo extends StatefulWidget {
  @override
  _ScrollMateDemoState createState() => _ScrollMateDemoState();
}

class _ScrollMateDemoState extends State<ScrollMateDemo> {
  ScrollController _scrollController;
  ScrollMateController _scrollMateController;

  @override
  void initState() {
    super.initState();
    _scrollController = ScrollController();
    _scrollMateController = ScrollMateController(
      scrollController: _scrollController,
      // 配置粘性头部和底部的相关参数
      sliverPersistentHeaderBuilder: (context, shrinkOffset) {
        return SliverPersistentHeader(
          delegate: StickyHeaderDelegate(
            minHeight: 60.0,
            maxHeight: 200.0,
            child: Container(
              color: Colors.blue,
              alignment: Alignment.center,
              child: Text('Sticky Header'),
            ),
          ),
          pinned: true,
          floating: true,
        );
      },
      bottomStickyBuilder: (context) {
        return Container(
          color: Colors.grey[300],
          height: 50,
          alignment: Alignment.center,
          child: Text('Sticky Footer'),
        );
      },
    );
  }

  @override
  void dispose() {
    _scrollController.dispose();
    _scrollMateController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Scroll Mate Demo'),
      ),
      body: ScrollMate(
        controller: _scrollMateController,
        child: CustomScrollView(
          controller: _scrollController,
          slivers: <Widget>[
            // 这里可以添加更多的Sliver组件,比如SliverList, SliverGrid等
            SliverList(
              delegate: SliverChildListDelegate(
                List.generate(
                  50,
                  (index) => ListTile(
                    title: Text('Item $index'),
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class StickyHeaderDelegate extends SliverPersistentHeaderDelegate {
  final double minHeight;
  final double maxHeight;
  final Widget child;

  StickyHeaderDelegate({
    required this.minHeight,
    required this.maxHeight,
    required this.child,
  });

  @override
  double get minExtent => minHeight;

  @override
  double get maxExtent => maxHeight;

  @override
  Widget build(
      BuildContext context, double shrinkOffset, bool overlapsContent) {
    return Container(
      child: child,
    );
  }

  @override
  bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
    return false;
  }
}

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

  1. 创建了一个ScrollController和一个ScrollMateController
  2. 使用ScrollMateController配置了粘性头部和底部导航栏。
  3. ScrollMate组件中包裹了一个CustomScrollView,并将ScrollController传递给它。
  4. 定义了一个自定义的SliverPersistentHeaderDelegate来处理粘性头部的高度变化。

这个示例展示了如何使用scroll_mate来增强Flutter中的滚动体验,包括粘性头部和底部导航栏。你可以根据需求进一步自定义和扩展这个示例。

回到顶部