我的涉及 GravitySimulation 的动画不会动画
My Animation involving a GravitySimulation won't animate
正在制作动画的容器小部件停留在动画的起点,即。动画不会启动,但如果使用单个小部件而不是像我制作的 particles
列表那样的小部件列表,则动画可以正常工作。
为什么会这样,我该如何解决?提前致谢!
这是我的代码:
import 'package:flutter/material.dart';
import 'package:flutter/animation.dart';
import 'package:flutter/physics.dart';
import 'dart:math';
void main() => runApp(PhysicsAnimation());
class PhysicsAnimation extends StatefulWidget {
_PhysicsAnimation createState() => _PhysicsAnimation();
}
class _PhysicsAnimation extends State<PhysicsAnimation>
with TickerProviderStateMixin{
AnimationController controller;
GravitySimulation simulation;
List<Widget> particles=[];
bool isLoad=true;
Random random=new Random();
@override
void initState() {
super.initState();
simulation = GravitySimulation(
100, // acceleration
0.0, // starting point
2000.0, // end point
5, // starting velocity
);
controller =
AnimationController(vsync: this, upperBound: 800)
..addListener(() {
setState(() {});
});
controller.animateWith(simulation);
}
@override
Widget build(BuildContext context) {
if (isLoad) {
for(int i=0;i<20;i++){
particles.add(Positioned(
left: 50+random.nextDouble()*100,
top: controller.value,
height: 10,
width: 10,
child: Container(
color: Colors.redAccent,
)));}
}
isLoad=false;
return MaterialApp(
home: Stack(
children:
particles
),
);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
}
我知道这已经有一段时间了,但是您设法解决了这个问题吗?我认为您需要在 setState 中重置 isLoad 并在添加更多粒子之前清除粒子列表。
controller = AnimationController(vsync: this, upperBound: 800)
..addListener(() {
setState(() {
**isLoad = true;**
});
});
...
Widget build(BuildContext context) {
if (isLoad) {
**particles.clear();**
for (int i = 0; i < 5; i++) {
particles.add(Positioned(
left: 50 + random.nextDouble() * 500,
top: controller.value,
height: 10,
width: 10,
child: Container(
color: Colors.redAccent,
)));
}
}
isLoad = false;
return Stack(children: particles);
}
正在制作动画的容器小部件停留在动画的起点,即。动画不会启动,但如果使用单个小部件而不是像我制作的 particles
列表那样的小部件列表,则动画可以正常工作。
为什么会这样,我该如何解决?提前致谢!
这是我的代码:
import 'package:flutter/material.dart';
import 'package:flutter/animation.dart';
import 'package:flutter/physics.dart';
import 'dart:math';
void main() => runApp(PhysicsAnimation());
class PhysicsAnimation extends StatefulWidget {
_PhysicsAnimation createState() => _PhysicsAnimation();
}
class _PhysicsAnimation extends State<PhysicsAnimation>
with TickerProviderStateMixin{
AnimationController controller;
GravitySimulation simulation;
List<Widget> particles=[];
bool isLoad=true;
Random random=new Random();
@override
void initState() {
super.initState();
simulation = GravitySimulation(
100, // acceleration
0.0, // starting point
2000.0, // end point
5, // starting velocity
);
controller =
AnimationController(vsync: this, upperBound: 800)
..addListener(() {
setState(() {});
});
controller.animateWith(simulation);
}
@override
Widget build(BuildContext context) {
if (isLoad) {
for(int i=0;i<20;i++){
particles.add(Positioned(
left: 50+random.nextDouble()*100,
top: controller.value,
height: 10,
width: 10,
child: Container(
color: Colors.redAccent,
)));}
}
isLoad=false;
return MaterialApp(
home: Stack(
children:
particles
),
);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
}
我知道这已经有一段时间了,但是您设法解决了这个问题吗?我认为您需要在 setState 中重置 isLoad 并在添加更多粒子之前清除粒子列表。
controller = AnimationController(vsync: this, upperBound: 800)
..addListener(() {
setState(() {
**isLoad = true;**
});
});
...
Widget build(BuildContext context) {
if (isLoad) {
**particles.clear();**
for (int i = 0; i < 5; i++) {
particles.add(Positioned(
left: 50 + random.nextDouble() * 500,
top: controller.value,
height: 10,
width: 10,
child: Container(
color: Colors.redAccent,
)));
}
}
isLoad = false;
return Stack(children: particles);
}