Flutter滚动动画切换标签插件scroll_to_animate_tab的使用

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

Flutter滚动动画切换标签插件scroll_to_animate_tab的使用

scroll_to_animate_tab 是一个Flutter插件,它提供了一个可定制化的组件,并且可以同步ScrollView与标签。通过这个插件,你可以创建独立的标签页,这些标签页会与内部的ScrollView进行协调。标签页位于ScrollView索引之后。

Demo

安装

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

dependencies:
  scroll_to_animate_tab: latest

或者直接使用命令行安装:

flutter pub add scroll_to_animate_tab

API

ScrollToAnimateTab

Parameter Definition
List<ScrollableList> tabs 要渲染的标签列表
double tabHeight 标签的高度
Duration? tabAnimationDuration [可选] 标签切换动画的持续时间
Duration? bodyAnimationDuration [可选] ScrollView内部索引切换动画的持续时间
Curve? tabAnimationCurve [可选] 标签切换时使用的动画曲线
Curve? bodyAnimationCurve [可选] 切换ScrollView内部索引时使用的动画曲线
Color? backgroundColor [可选] 更改标签栏的背景颜色
TabDecoration? activeTabDecoration [可选] 更改激活标签的装饰
TabDecoration? inActiveTabDecoration [可选] 更改非激活标签的装饰

TabDecoration

Parameter Definition
TextStyle textStyle 标签文本样式
Decoration? decoration 标签装饰

ScrollableList

Parameter Definition
String label 标签文本和作为ScrollableList.body的标题
Widget? bodyLabelDecoration 用于装饰主体部件的小部件,默认是一个Text小部件,显示ScrollableList.label,字体颜色为黑色,加粗,字号为21
Widget body 可滚动标签列表中的单个部件。你可以使用Column或任何单个可滚动部件。如果你想要使用ScrollView(例如ListView),我们建议确保body是用ScrollView.shrinkWrap = trueScrollView.physics = NeverScrollableScrollPhysics创建的

如何使用

基本示例

以下是一个基本的使用示例:

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'scroll_to_animate_tab Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'scroll_to_animate_tab Demo'),
    );
  }
}

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

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: ScrollToAnimateTab(
        activeTabDecoration: TabDecoration(
          textStyle: const TextStyle(
            color: Colors.red, 
            fontWeight: FontWeight.bold, 
            fontSize: 18
          ),
          decoration: BoxDecoration(
            border: Border.all(color: Colors.black),
            borderRadius: const BorderRadius.all(Radius.circular(5))
          )
        ),
        inActiveTabDecoration: TabDecoration(
          textStyle: const TextStyle(color: Colors.black),
          decoration: BoxDecoration(
            border: Border.all(color: Colors.black12),
            borderRadius: const BorderRadius.all(Radius.circular(5))
          )
        ),
        tabs: [
          ScrollableList(
            label: "Hello",
            body: ListView.builder(
              shrinkWrap: true,
              physics: const NeverScrollableScrollPhysics(),
              itemCount: 10,
              itemBuilder: (_, index) => ListTile(
                title: Text('List element ${index + 1}'),
              ),
            )
          ),
          ScrollableList(
            label: "hello 2",
            body: Column(
              children: List.generate(
                10,
                (index) => ListTile(
                  title: Text('List element ${index + 1}')
                )
              ),
            )
          ),
          ScrollableList(
            label: "Hello000",
            body: ListView.builder(
              shrinkWrap: true,
              physics: const NeverScrollableScrollPhysics(),
              itemCount: 10,
              itemBuilder: (_, index) => ListTile(
                title: Text('List element ${index + 1}')
              )
            )
          ),
          ScrollableList(
            label: "hello",
            body: ListView.builder(
              shrinkWrap: true,
              physics: const NeverScrollableScrollPhysics(),
              itemCount: 10,
              itemBuilder: (_, index) => ListTile(
                title: Text('List element ${index + 1}')
              )
            )
          ),
          ScrollableList(
            label: "hola",
            body: ListView.builder(
              shrinkWrap: true,
              physics: const NeverScrollableScrollPhysics(),
              itemCount: 10,
              itemBuilder: (_, index) => ListTile(
                title: Text('List element ${index + 1}')
              )
            )
          ),
        ],
      ),
    );
  }
}

以上代码展示了一个完整的Flutter应用,其中包含了如何使用scroll_to_animate_tab插件来创建带有滚动动画效果的标签页。你可以根据需要调整标签的数量、内容以及动画效果等参数。


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

1 回复

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


当然,下面是一个关于如何使用 scroll_to_animate_tab 插件在 Flutter 中实现滚动动画切换标签的示例代码。这个插件可以帮助你在滚动视图时平滑地切换标签页。

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

dependencies:
  flutter:
    sdk: flutter
  scroll_to_animate_tab: ^x.y.z  # 请替换为最新版本号

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

接下来是完整的 Flutter 应用示例代码,展示了如何使用 scroll_to_animate_tab 插件:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  late TabController _tabController;
  late ScrollController _scrollController;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 3, vsync: this);
    _scrollController = ScrollController();

    // 监听滚动事件以同步标签页
    _scrollController.addListener(() {
      double position = _scrollController.position.pixels;
      double maxScroll = _scrollController.position.maxScrollExtent;
      int tabIndex = (position / maxScroll * 2).toInt(); // 根据滚动位置计算标签索引(假设只有两个标签页时)
      if (tabIndex >= 0 && tabIndex < _tabController.length) {
        _tabController.animateTo(tabIndex);
      }
    });
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Scroll to Animate Tab Demo'),
      ),
      body: Column(
        children: [
          AnimatedTabBarView(
            controller: _tabController,
            scrollController: _scrollController,
            tabBar: TabBar(
              tabs: [
                Tab(icon: Icon(Icons.home), text: 'Home'),
                Tab(icon: Icon(Icons.star), text: 'Favorites'),
                Tab(icon: Icon(Icons.settings), text: 'Settings'),
              ],
            ),
            views: [
              Center(child: Text('Home Page')),
              Center(child: Text('Favorites Page')),
              Center(child: Text('Settings Page')),
            ],
          ),
          Expanded(
            child: ListView.builder(
              controller: _scrollController,
              itemCount: 50,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text('Item $index'),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

代码解释:

  1. 依赖项:确保在 pubspec.yaml 中添加了 scroll_to_animate_tab 依赖项。

  2. 状态管理:使用 StatefulWidgetSingleTickerProviderStateMixin 来管理 TabControllerScrollController 的生命周期。

  3. 初始化:在 initState 中初始化 TabControllerScrollController,并添加滚动监听器,根据滚动位置计算当前应该显示的标签页索引。

  4. 释放资源:在 dispose 方法中释放 TabControllerScrollController 的资源。

  5. UI 布局:使用 AnimatedTabBarView 包裹 TabBar 和相应的视图,并传入 scrollController 以同步滚动和标签页的切换。

  6. 滚动视图:使用 ListView.builder 创建滚动视图,并传入 ScrollController

注意:AnimatedTabBarView 并不是 Flutter 官方组件,而是 scroll_to_animate_tab 插件提供的自定义组件。你需要确保 scroll_to_animate_tab 插件提供了这个组件。如果插件中没有这个组件,你可能需要根据插件提供的 API 进行自定义实现。

希望这个示例代码能帮助你理解如何在 Flutter 中使用 scroll_to_animate_tab 插件实现滚动动画切换标签。

回到顶部