Flutter实战一Flutter聊天应用(三)
我们可以向控件添加动画效果,使应用程序的用户体验更加流畅和直观。在这篇文章中,我们将在聊天消息列表中添加基本动画效果。当用户发送新消息时,我们不要将其简单地显示在消息列表中,我们将从列表底部垂直放置消息。 Flutter中的动画被封装为包含类型值和状态(如前进、后退、完成和关闭)的 使用 class ChatScreenState extends State<ChatScreen> with TickerProviderStateMixin {
final List<ChatMessage> _messages = <ChatMessage>[];
final TextEditingController _textController = new TextEditingController();
//...
在 在 class ChatMessage extends StatelessWidget {
ChatMessage({this.text,this.animationController});
final String text;
final AnimationController animationController;
//...
将动画控制器附加到新的 class ChatScreenState extends State<ChatScreen> with TickerProviderStateMixin {
//...
void _handleSubmitted(String text) {
_textController.clear();
ChatMessage message = new ChatMessage(
text: text,animationController: new AnimationController(
duration: new Duration(milliseconds: 700),vsync: this
)
);
setState((){
_messages.insert(0,message);
});
message.animationController.forward();
}
//...
}
修改
class ChatMessage extends StatelessWidget {
//...
Widget build(BuildContext context) {
return new SizeTransition(
sizeFactor: new CurvedAnimation(
parent: animationController,curve: Curves.eaSEOut
),axisAlignment: 0.0,child: new Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),child: new Row(
crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[
new Container(
margin: const EdgeInsets.only(right: 16.0),child: new CircleAvatar(child: new Text(_name[0])),),new Column(
crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[
new Text(_name,style: Theme.of(context).textTheme.subhead),new Container(
margin: const EdgeInsets.only(top: 5.0),child: new Text(text),)
]
)
]
)
)
);
}
//...
}
处理动画控制器以在我们不再需要资源时释放资源是个好习惯,下面的代码片段显示了如何通过在 class ChatScreenState extends State<ChatScreen> with TickerProviderStateMixin {
//...
@override
void dispose() {
for(ChatMessage message in _messages)
message.animationController.dispose();
super.dispose();
}
//...
}
这里有一个小细节,我们的应用程序在右上角有一个“SLOW MODE”横幅。因为在默认情况下, 调试配置还会检查所有的断言,这有利于我们在开发过程中尽早捕获错误,但是这也会增加运行时的成本。“SLOW MODE”横幅表示启用这些检查。我们可以通过使用 在上面代码中,我们将动画的运行时间指定为700毫秒,是为了可以看到动画的转换过程, 实际上我们可以把这个时间设置成300毫秒,或者其他更合适的时间。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |