Flutter渐变滚动效果插件fading_scroll的使用

Flutter渐变滚动效果插件fading_scroll的使用

快速入门

首先,将 fading_scroll 添加到你的 pubspec.yaml 文件中。

flutter pub add fading_scroll

然后,你可以使用 FadingScroll 包裹你的可滚动内容,并传递一个 ScrollController 给你的滚动组件。

[@override](/user/override)
Widget build(BuildContext context) {
    return FadingScroll(
        builder: (context, controller) {
            return ListView(
                controller: controller,
                children: [
                    // 这里可以添加你的滚动内容
                ],
            ),
        },
    );
}

使用方法

自定义渐变大小和滚动阈值

你可以通过提供自定义的滚动范围和渐变大小来定制效果。

[@override](/user/override)
Widget build(BuildContext context) {
    return FadingScroll(
        fadingSize: 100, // 渐变区域的高度
        scrollExtent: 120, // 滚动阈值
        builder: (context, controller) {
            return ListView(
                controller: controller,
                children: [
                    // 这里可以添加你的滚动内容
                ],
            ),
        },
    );
}

使用不同的控制器

你还可以提供自己的 ScrollControllerFadingScroll。这在使用子类控制器(如 PageController)时非常有用。

class _State_ extends State<Example> {
  late final pageController = PageController();

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FadingScroll(
      controller: pageController,
      builder: (context, controller) {
        return PageView(
          controller: pageController,
          children: [
              // 这里可以添加你的滚动内容
          ],
        );
      },
    );
  }
}

示例代码

以下是一个完整的示例代码,展示了如何使用 fading_scroll 插件实现不同的滚动效果。

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

void main() {
  runApp(
    const MaterialApp(
      title: 'Fading Scroll',
      home: HomePage(),
    ),
  );
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Fading Scroll'),
      ),
      body: ListView(
        children: [
          ...const <ExampleWidget>[
            VerticalListViewExample(),
            PageViewExample(),
            MixedViewExample(),
          ].map(
            (example) => ListTile(
              title: Text(example.title),
              onTap: () async {
                await Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => Scaffold(
                      appBar: AppBar(
                        title: Text(example.title),
                      ),
                      body: example,
                    ),
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

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

  String get title;
}

class VerticalListViewExample extends ExampleWidget {
  const VerticalListViewExample({
    super.key,
    this.startColor = const Color(0xFFFF1FCE),
    this.endColor = const Color(0xFFFFBB11),
  });

  final Color startColor;
  final Color endColor;

  [@override](/user/override)
  String get title => 'Vertical ListView';

  [@override](/user/override)
  State<VerticalListViewExample> createState() => _VerticalListViewExampleState();
}

class _VerticalListViewExampleState extends State<VerticalListViewExample>
    with AutomaticKeepAliveClientMixin<VerticalListViewExample> {
  [@override](/user/override)
  bool get wantKeepAlive => true;

  [@override](/user/override)
  Widget build(BuildContext context) {
    super.build(context);
    return FadingScroll(
      fadingSize: 200,
      builder: (context, controller) {
        return ListView(
          controller: controller,
          children: [
            for (var i = 0; i < 100; i++)
              Card(
                child: ListTile(
                  leading: Container(
                    width: 32,
                    height: 32,
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(4),
                      color: Color.lerp(
                        widget.startColor,
                        widget.endColor,
                        i / 100.0,
                      ),
                    ),
                  ),
                  title: Text('Color $i'),
                ),
              ),
          ],
        );
      },
    );
  }
}

class PageViewExample extends ExampleWidget {
  const PageViewExample({
    super.key,
  });
  [@override](/user/override)
  String get title => 'PageView';

  [@override](/user/override)
  State<PageViewExample> createState() => _PageViewExampleState();
}

class _PageViewExampleState extends State<PageViewExample> {
  late final PageController controller = PageController();

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FadingScroll(
      controller: controller,
      builder: (context, controller) {
        return PageView(
          controller: this.controller,
          children: [
            for (var i = 0; i < 6; i++)
              Card(
                child: ListView(
                  children: [
                    Container(
                      height: 200,
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(4),
                        color: Color.lerp(
                          const Color(0xFFFF1FCE),
                          const Color(0xFFFFBB11),
                          i / 6.0,
                        ),
                      ),
                    ),
                    Text(
                      'Color $i',
                      textAlign: TextAlign.center,
                      style: Theme.of(context).textTheme.headlineSmall,
                    ),
                  ],
                ),
              ),
          ],
        );
      },
    );
  }
}

class MixedViewExample extends ExampleWidget {
  const MixedViewExample({
    super.key,
  });
  [@override](/user/override)
  String get title => 'Mixed Example';

  [@override](/user/override)
  State<MixedViewExample> createState() => _MixedViewExampleState();
}

class _MixedViewExampleState extends State<MixedViewExample> {
  late final PageController controller = PageController();

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FadingScroll(
      fadingSize: 100,
      controller: controller,
      builder: (context, controller) {
        return PageView(
          controller: this.controller,
          children: [
            for (var i = 0; i < 6; i++) const VerticalListViewExample(),
          ],
        );
      },
    );
  }
}

更多关于Flutter渐变滚动效果插件fading_scroll的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


fading_scroll 是一个 Flutter 插件,用于在滚动时添加渐变效果,使得内容在滚动到顶部或底部时逐渐淡出。这种效果通常用于改善用户体验,使得滚动看起来更加平滑和自然。

以下是使用 fading_scroll 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 fading_scroll 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  fading_scroll: ^0.1.0 # 请使用最新版本

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

2. 导入包

在需要使用 fading_scroll 的地方导入包:

import 'package:fading_scroll/fading_scroll.dart';

3. 使用 FadingScroll 组件

FadingScroll 是一个包装组件,你可以将它包裹在 ListViewGridView 或其他滚动组件上。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fading Scroll Example'),
        ),
        body: FadingScroll(
          child: ListView.builder(
            itemCount: 50,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('Item $index'),
              );
            },
          ),
        ),
      ),
    );
  }
}

4. 自定义渐变效果

你可以通过 FadingScrollfadeColorfadeSize 参数来自定义渐变效果:

  • fadeColor: 渐变的颜色,默认为 Colors.white
  • fadeSize: 渐变区域的大小,默认为 50.0

例如:

FadingScroll(
  fadeColor: Colors.blue.withOpacity(0.5),
  fadeSize: 100.0,
  child: ListView.builder(
    itemCount: 50,
    itemBuilder: (context, index) {
      return ListTile(
        title: Text('Item $index'),
      );
    },
  ),
)

5. 其他配置

FadingScroll 还提供了其他一些配置选项,例如 fadeTopfadeBottom,用于控制是否在顶部和底部显示渐变效果。

FadingScroll(
  fadeTop: true, // 默认启用顶部渐变
  fadeBottom: true, // 默认启用底部渐变
  child: ListView.builder(
    itemCount: 50,
    itemBuilder: (context, index) {
      return ListTile(
        title: Text('Item $index'),
      );
    },
  ),
)
回到顶部