dart - Flutter 自定义动画对话框

我正在尝试为 dart 中的自定义对话框设置动画,以便在弹出时创建一些动画。 Android 中有一个带有动画对话框的库,Flutter 中有没有类似的库 Sweet Alert Dialog

我们如何在 Flutter 中实现相同的功能?

最佳答案

要创建对话框,您可以使用 Overlay Dialog类。如果你想在给定的框架中添加动画,你可以使用 AnimationController就像下面的例子一样。 CurvedAnimation类用于在动画上创建弹跳效果。

更新: 一般情况下,最好使用 showDialog 显示对话框。函数,因为关闭和手势是由 Flutter 处理的。我已经更新了示例,它现在使用 showDialog 运行,您可以通过点击背景关闭对话框。

您可以将以下代码复制并粘贴到新项目中并进行调整。它可以自己运行。

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(title: 'Flutter Demo', theme: ThemeData(), home: Page());
  }
}

class Page extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton.icon(
            onPressed: () {
              showDialog(
                context: context,
                builder: (_) => FunkyOverlay(),
              );
            },
            icon: Icon(Icons.message),
            label: Text("PopUp!")),
      ),
    );
  }
}

class FunkyOverlay extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => FunkyOverlayState();
}

class FunkyOverlayState extends State<FunkyOverlay>
    with SingleTickerProviderStateMixin {
  AnimationController controller;
  Animation<double> scaleAnimation;

  @override
  void initState() {
    super.initState();

    controller =
        AnimationController(vsync: this, duration: Duration(milliseconds: 450));
    scaleAnimation =
        CurvedAnimation(parent: controller, curve: Curves.elasticInOut);

    controller.addListener(() {
      setState(() {});
    });

    controller.forward();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Material(
        color: Colors.transparent,
        child: ScaleTransition(
          scale: scaleAnimation,
          child: Container(
            decoration: ShapeDecoration(
                color: Colors.white,
                shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(15.0))),
            child: Padding(
              padding: const EdgeInsets.all(50.0),
              child: Text("Well hello there!"),
            ),
          ),
        ),
      ),
    );
  }
}

https://stackoverflow.com/questions/52408610/

相关文章:

dart - 使用 NetworkImage 进行 Flutter 小部件测试

regex - 如何从 Dart 中的字符串中仅删除符号

dart - 全宽按钮,如何对齐文本

dart - Flutter Android PreferenceScreen 设置页面

testing - Flutter:如何加载文件进行测试

facebook - 如何在 Flutter 应用中实现分享按钮?

flutter - 如何创建返回小部件数组的函数

datetime - 如何到达 Dart 的最后一个午夜?

flutter - 在 initState 中调用 SetState 的重要性

flutter - child : and children: property in Flutte