flutter - 加载数据时制作骨架屏幕的最简单方法

我是 Flutter 的新手,我正在尝试制作与片段中包含的示例类似的东西。 用飞镖和 flutter 最简单的方法是什么。

基本上,当来自服务器的数据仍在下载时,我想将闪耀动画应用于容器。

谢谢

div {
    margin: auto;
		width: 500px;
		height: 600px; /* change height to see repeat-y behavior */
    
		background-image:
			radial-gradient( circle 50px at 50px 50px, lightgray 99%, transparent 0 ),
			linear-gradient( 100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.5) 50%, rgba(255, 255, 255, 0) 80% ),
			linear-gradient( lightgray 20px, transparent 0 ),
			linear-gradient( lightgray 20px, transparent 0 ),
			linear-gradient( lightgray 20px, transparent 0 ),
			linear-gradient( lightgray 20px, transparent 0 );

		background-repeat: repeat-y;

		background-size:
			100px 200px, /* circle */
			50px 200px, /* highlight */
			150px 200px,
			350px 200px,
			300px 200px,
			250px 200px;

		background-position:
			0 0, /* circle */
			0 0, /* highlight */
			120px 0,
			120px 40px,
			120px 80px,
			120px 120px;

		animation: shine 1s infinite;
	}

	@keyframes shine {
		to {
			background-position:
				0 0,
				100% 0, /* move highlight to right */
				120px 0,
				120px 40px,
				120px 80px,
				120px 120px;
		}
	}
<div></div>

最佳答案

您可以将 StackPositioned.fillFractionallySizedBox 结合起来,以将此类渐变定位在另一个小部件的顶部。

然后你可以将它组合到一个 AnimationController、一个 AnimatedBuilder 和一个 AlignFractionallySizedBox 来制作动画梯度随时间变化的位置。

你会有这个:

class LoadAnimation extends StatefulWidget {
  final Widget child;

  LoadAnimation({@required this.child, Key key}) : super(key: key);

  @override
  _LoadAnimationState createState() => _LoadAnimationState();
}

class _LoadAnimationState extends State<LoadAnimation>
    with SingleTickerProviderStateMixin {
  AnimationController controller;

  @override
  void initState() {
    controller = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 1),
    )..repeat();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        widget.child,
        Positioned.fill(
          child: ClipRect(
              child: AnimatedBuilder(
            animation: controller,
            builder: (context, child) {
              return FractionallySizedBox(
                widthFactor: .2,
                alignment: AlignmentGeometryTween(
                  begin: Alignment(-1.0 - .2 * 3, .0),
                  end: Alignment(1.0 + .2 * 3, .0),
                ).chain(CurveTween(curve: Curves.easeOut)).evaluate(controller),
                child: child,
              );
            },
            child: const DecoratedBox(
              decoration: const BoxDecoration(
                gradient: const LinearGradient(
                  colors: const [
                    Color.fromARGB(0, 255, 255, 255),
                    Colors.white,
                  ],
                ),
              ),
            ),
          )),
        ),
      ],
    );
  }
}

然后您可以通过包装任何给定的小部件来使用它:

LoadAnimation(
  child: Container(
    height: 100.0,
    width: 200.0,
    color: Colors.lime,
  ),
),

https://stackoverflow.com/questions/51677301/

相关文章:

flutter - 内置值对象的 setter 是什么

dart - 我可以在未来的构建器上使用多种方法吗?

dart - Flutter:创建时间线 UI

flutter - 如何在指针向下事件的位置绘制 CustomPaint 小部件?

java - flutter 中是否有任何类可以像处理程序一样工作?

dart - 如何为 Flutter 应用绘制折线图?

dart - Dart 中的类型定义

flutter - Sizedbox 与填充列和行中的距离

dart - 在 Flutter 中从文件中读取二维码

firebase - Flutter - firebase_auth updateProfile 方