【问题标题】:Flutter: How to animate a widget before transition is triggered?Flutter:如何在触发转换之前为小部件设置动画?
【发布时间】:2019-07-25 05:48:30
【问题描述】:

您知道如何在转换到新屏幕之前为小部件设置动画吗?我的意思是:

  1. 用户点击 FAB,打开一个新屏幕
  2. 在用户点击后,FAB 会被动画缩小直到不可见(就像原生开发中的隐藏功能)
  3. 当FAB不可见时,触发新的屏幕过渡

在原生开发中通过一个活动/多个片段来实现这一点相对容易,但我在颤振中找不到这样做的方法:/

【问题讨论】:

    标签: android animation flutter transition


    【解决方案1】:

    您需要使用AnimationController 并为您的FAB 配置它并附加AnimationStatusListener。按下 FAB 后,您将启动动画,一旦动画完成,您将在状态监听器中导航到下一页。

    这里我给你写了一段代码:

    import 'package:flutter/animation.dart';
    import 'package:flutter/material.dart';
    
    void main() => runApp(
          MaterialApp(
            home: FabApp(),
          ),
        );
    
    class FabApp extends StatefulWidget {
      _FabAppState createState() => _FabAppState();
    }
    
    class _FabAppState extends State<FabApp> with SingleTickerProviderStateMixin {
      Animation<double> animation;
      AnimationController controller;
    
      @override
      void initState() {
        super.initState();
        controller = AnimationController(
          duration: const Duration(seconds: 2),
          vsync: this,
        );
        controller.addListener(() {
          setState(() {});
        });
        controller.addStatusListener((status) {
          if (status == AnimationStatus.completed) {
            Navigator.of(context).push(
              MaterialPageRoute<void>(builder: (BuildContext context) {
                return Scaffold(
                  body: Text("Hi"),
                );
              }),
            );
          }
        });
        animation = Tween<double>(begin: 1, end: 0).animate(controller);
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          floatingActionButton: Transform.scale(
            scale: animation.value,
            child: FloatingActionButton(onPressed: () {
              controller.forward();
            }),
          ),
        );
      }
    
      @override
      void dispose() {
        controller.dispose();
        super.dispose();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-12
      • 2021-01-14
      • 2023-03-10
      • 1970-01-01
      • 2019-08-16
      • 2023-03-06
      • 2021-02-27
      • 2022-08-17
      相关资源
      最近更新 更多