Flutter动画切换插件motion_switcher的使用

Flutter动画切换插件motion_switcher的使用

这个包包含多个非常容易使用的组件,可以将你的自定义组件包装在动画中。

这些动画是隐式的,不需要你创建自己的状态或编排。

组件

  • MotionSwitcher - 动画化其子部件之间的切换,类似于 AnimatedSwitcher
  • MotionImage - 基于图像提供者的更改加载和动画化图像。
  • MotionView - 动画化类似 PageView 的轮播滚动。
  • MotionViewIndicator - 快速实现 MotionView 的页面指示器的部件。

示例

对于详细的示例和一个你可以交互的应用,请查看 lib/widgets/example_ 部件在 例子 中。

MotionSwitcher 动画化列表的加载过程

final list = switch (listStatus) {
  ListStatus.loading => CircularProgressIndicator(),
  ListStatus.empty => Text("Nothing here"),
  ListStatus.paginated => ListView(...),
};

// 子部件将会被动画化,因为它们的类型不同。
//
// 如果要对相同类型的部件进行动画处理,可以通过唯一的键或使用 `[MotionSwitcherTag]` 进行区分。
return MotionSwitcher.vertical(child: list);

MotionImage 加载并动画化网络图像

return MotionImage(
  imageProvider: NetworkImage(...),
  idleChild: CircularProgressIndicator(),
);

MotionView 动画化文本部件的轮播

return MotionView.horizontal(
  controller: pageController,
  clipBehavior: Clip.none,
  itemCount: 4,
  itemBuilder: (context, index) => Text("Showing item $index"),
);

详细示例

完整示例Demo

以下是一个完整的示例,展示了如何使用 MotionSwitcher 来实现列表的动画切换。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('MotionSwitcher 示例'),
        ),
        body: MotionSwitcherExample(),
      ),
    );
  }
}

class MotionSwitcherExample extends StatefulWidget {
  [@override](/user/override)
  _MotionSwitcherExampleState createState() => _MotionSwitcherExampleState();
}

class _MotionSwitcherExampleState extends State<MotionSwitcherExample> {
  ListStatus _listStatus = ListStatus.loading;

  [@override](/user/override)
  Widget build(BuildContext context) {
    final list = switch (_listStatus) {
      ListStatus.loading => CircularProgressIndicator(),
      ListStatus.empty => Text("Nothing here"),
      ListStatus.paginated => ListView.builder(
          itemCount: 10,
          itemBuilder: (context, index) => ListTile(title: Text('Item $index')),
        ),
    };

    return Center(
      child: MotionSwitcher.vertical(
        child: list,
        transitionBuilder: (child, animation) => FadeTransition(
          opacity: animation,
          child: child,
        ),
      ),
    );
  }

  void changeListStatus() {
    setState(() {
      if (_listStatus == ListStatus.loading) {
        _listStatus = ListStatus.empty;
      } else if (_listStatus == ListStatus.empty) {
        _listStatus = ListStatus.paginated;
      } else {
        _listStatus = ListStatus.loading;
      }
    });
  }
}

enum ListStatus { loading, empty, paginated }

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

1 回复

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


motion_switcher 是一个用于在 Flutter 中实现动画切换的插件。它可以帮助你在两个小部件之间创建平滑的过渡动画。以下是如何使用 motion_switcher 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  motion_switcher: ^1.0.0  # 请检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 motion_switcher 包:

import 'package:motion_switcher/motion_switcher.dart';

3. 使用 MotionSwitcher

MotionSwitcher 允许你在两个小部件之间创建动画切换。你可以通过设置 showFirst 属性来控制显示哪个小部件,并通过 transitionBuilder 属性来定义过渡动画。

以下是一个简单的示例:

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

class MotionSwitcherExample extends StatefulWidget {
  @override
  _MotionSwitcherExampleState createState() => _MotionSwitcherExampleState();
}

class _MotionSwitcherExampleState extends State<MotionSwitcherExample> {
  bool _showFirst = true;

  void _toggle() {
    setState(() {
      _showFirst = !_showFirst;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MotionSwitcher Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            MotionSwitcher(
              showFirst: _showFirst,
              firstChild: Container(
                width: 100,
                height: 100,
                color: Colors.blue,
                child: Center(child: Text('First')),
              ),
              secondChild: Container(
                width: 100,
                height: 100,
                color: Colors.red,
                child: Center(child: Text('Second')),
              ),
              transitionBuilder: (child, animation) {
                return FadeTransition(
                  opacity: animation,
                  child: child,
                );
              },
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _toggle,
              child: Text('Toggle'),
            ),
          ],
        ),
      ),
    );
  }
}

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

4. 解释代码

  • MotionSwitcher 是核心组件,它接受 showFirstfirstChildsecondChildtransitionBuilder 等属性。
  • showFirst 是一个布尔值,用于决定显示 firstChild 还是 secondChild
  • firstChildsecondChild 是需要切换的两个小部件。
  • transitionBuilder 是一个函数,用于定义过渡动画。在这个例子中,我们使用了 FadeTransition 来实现淡入淡出的效果。
  • _toggle 方法用于切换 showFirst 的值,从而触发动画。

5. 运行应用

运行应用后,你将看到一个按钮和两个不同颜色的方块。点击按钮时,方块会通过淡入淡出的效果进行切换。

6. 自定义动画

你可以根据需要自定义 transitionBuilder 中的动画效果。例如,你可以使用 ScaleTransitionSlideTransition 或其他 Flutter 提供的过渡动画。

transitionBuilder: (child, animation) {
  return ScaleTransition(
    scale: animation,
    child: child,
  );
}
回到顶部