如何在范围模型中作为ScopedModeldescendant的窗口小部件中运行动画 . 我有一个红色按钮,点击时显示一个正方形 . 3秒后,方块会消失,这很快就会发生 . 我想做的是让广场在几秒钟内消失 . 我尝试了AnimationController,但它需要一个'vsync:'参数,我看到它通常在initState()中作为'vsync:this'完成,并在其他地方使用时出错 .
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:scoped_model/scoped_model.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'scoped model Opacity',
home: new ScopedModel<MyScopedModel>(
model: new MyScopedModel(),
child: new MyPage(),
),
);
}
}
class MyScopedModel extends Model {
double myOpacity = 0.0;
Timer myTimer;
AnimationController myAnimationController;
void myShowSquare() {
myOpacity = 1.0;
myTimer = new Timer(new Duration(seconds: 3), _removeSquare);
notifyListeners();
}
void _removeSquare() {
myOpacity = 0.0;
myTimer.cancel();
notifyListeners();
}
}
class MyPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Container(
color: Colors.grey,
child: new ScopedModelDescendant<MyScopedModel>(
builder: (context, child, model) => new Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
new GestureDetector(
onTap: model.myShowSquare,
child: new Stack(
alignment: Alignment.center,
children: <Widget>[
new Container(
constraints: new BoxConstraints.expand(
width: 50.0, height: 50.0),
color: Colors.deepOrange,
),
new Text(
'+',
style: new TextStyle(color: Colors.black),
),
],
),
),
new Opacity(
opacity: model.myOpacity,
child: new Container(
constraints:
new BoxConstraints.expand(width: 50.0,
height: 50.0),
color: Colors.amber,
),
)
],
),
));
}
}
1 回答
我认为你正在寻找的是一个FadeTransition,我相信它可以帮助你完成淡出你的小部件的艰苦工作 . 如果您想要更改大小,也可以使用AnimatedCrossFade小部件 .
但是,如果您建议查看Animation documentation和Animation Tutorial,他们将解释其工作原理的详细信息 .