修改聊天主界面
parent
ae498bdd7f
commit
20975951ba
|
|
@ -7,6 +7,10 @@ enum MessageType { SYSTEM, PUBLIC, CHAT, GROUP }
|
||||||
|
|
||||||
// 聊天数据
|
// 聊天数据
|
||||||
class MessageData {
|
class MessageData {
|
||||||
|
|
||||||
|
//id
|
||||||
|
int id;
|
||||||
|
|
||||||
//头像
|
//头像
|
||||||
String avatar;
|
String avatar;
|
||||||
|
|
||||||
|
|
@ -26,9 +30,9 @@ class MessageData {
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MessageData> messageData = [
|
List<MessageData> messageData = [
|
||||||
new MessageData("http://blogimages.jspang.com/blogtouxiang1.jpg", "一休哥", "一哥", new DateTime.now(), MessageType.CHAT),
|
new MessageData("http://blogimages.jspang.com/blogtouxiang1.jpg", "张三", "一哥", new DateTime.now(), MessageType.CHAT),
|
||||||
new MessageData("http://blogimages.jspang.com/blogtouxiang1.jpg", "一休哥", "一哥", new DateTime.now(), MessageType.CHAT),
|
new MessageData("http://blogimages.jspang.com/blogtouxiang1.jpg", "李四", "一哥", new DateTime.now(), MessageType.CHAT),
|
||||||
new MessageData("http://blogimages.jspang.com/blogtouxiang1.jpg", "一休哥", "一哥", new DateTime.now(), MessageType.CHAT),
|
new MessageData("http://blogimages.jspang.com/blogtouxiang1.jpg", "王麻子", "一哥", new DateTime.now(), MessageType.CHAT),
|
||||||
new MessageData("http://blogimages.jspang.com/blogtouxiang1.jpg", "一休哥", "一哥", new DateTime.now(), MessageType.CHAT),
|
new MessageData("http://blogimages.jspang.com/blogtouxiang1.jpg", "王五", "一哥", new DateTime.now(), MessageType.CHAT),
|
||||||
new MessageData("http://blogimages.jspang.com/blogtouxiang1.jpg", "一休哥", "一哥", new DateTime.now(), MessageType.CHAT),
|
new MessageData("http://blogimages.jspang.com/blogtouxiang1.jpg", "赵柳", "一哥", new DateTime.now(), MessageType.CHAT),
|
||||||
];
|
];
|
||||||
|
|
@ -1,18 +1,124 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:chatting/chatting_data_page.dart';
|
||||||
|
import 'package:chatting/chatting_message_page.dart';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 聊天主界面
|
||||||
|
*/
|
||||||
|
|
||||||
class ChattingDetails extends StatefulWidget {
|
class ChattingDetails extends StatefulWidget {
|
||||||
|
|
||||||
|
final MessageData messageData;
|
||||||
|
|
||||||
|
const ChattingDetails({Key key, @required this.messageData}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_ChattingDetailsState createState() => _ChattingDetailsState();
|
_ChattingDetailsState createState() => _ChattingDetailsState();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ChattingDetailsState extends State<ChattingDetails> {
|
class _ChattingDetailsState extends State<ChattingDetails> with TickerProviderStateMixin {
|
||||||
|
|
||||||
|
final List<ChatMessagePage> _messages = <ChatMessagePage>[];
|
||||||
|
|
||||||
TextEditingController _textEditingController =new TextEditingController();
|
TextEditingController _textEditingController =new TextEditingController();
|
||||||
|
|
||||||
|
bool _isComposing = false;
|
||||||
|
|
||||||
|
void _handleSubmitted(String text) {
|
||||||
|
_textEditingController.clear();
|
||||||
|
|
||||||
|
setState((){
|
||||||
|
_isComposing = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
ChatMessagePage message = new ChatMessagePage(
|
||||||
|
text: text,
|
||||||
|
animationController: new AnimationController(
|
||||||
|
duration: new Duration(milliseconds: 700),
|
||||||
|
vsync: this
|
||||||
|
),
|
||||||
|
messageData: widget.messageData,
|
||||||
|
);
|
||||||
|
setState((){
|
||||||
|
_messages.insert(0, message);
|
||||||
|
});
|
||||||
|
message.animationController.forward();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text(widget.messageData.title),
|
||||||
|
centerTitle: true,
|
||||||
|
),
|
||||||
|
body: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Flexible(
|
||||||
|
child: ListView.builder(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
reverse: true,
|
||||||
|
itemCount: _messages.length,
|
||||||
|
itemBuilder: (_,int index){
|
||||||
|
|
||||||
|
return _messages[index];
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Divider(height: 1.0,),
|
||||||
|
Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Theme.of(context).cardColor,
|
||||||
|
),
|
||||||
|
child: row()
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget row (){
|
||||||
|
return IconTheme(
|
||||||
|
//data: IconThemeData(color: Theme.of(context).accentColor),
|
||||||
|
data: IconThemeData(color: Colors.pink),
|
||||||
|
child: Container(
|
||||||
|
margin: const EdgeInsets.symmetric(horizontal: 8.0),
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Flexible(
|
||||||
|
child: TextField(
|
||||||
|
controller: _textEditingController,
|
||||||
|
onChanged: (String text) {
|
||||||
|
setState((){
|
||||||
|
_isComposing = text.length > 0;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onSubmitted: _handleSubmitted,
|
||||||
|
decoration: new InputDecoration.collapsed(hintText: '发送消息'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: new EdgeInsets.symmetric(horizontal: 4.0),
|
||||||
|
child: new IconButton(
|
||||||
|
icon: new Icon(Icons.send),
|
||||||
|
onPressed: _isComposing ? () => _handleSubmitted(_textEditingController.text) : null
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
for(ChatMessagePage message in _messages)
|
||||||
|
message.animationController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:date_format/date_format.dart';
|
import 'package:date_format/date_format.dart';
|
||||||
import 'package:chatting/chatting_data_page.dart';
|
import 'package:chatting/chatting_data_page.dart';
|
||||||
import 'package:chatting/touch_callback.dart';
|
import 'package:chatting/touch_callback.dart';
|
||||||
|
import 'package:chatting/chatting_details_page.dart';
|
||||||
|
|
||||||
class ChattingItemPage extends StatelessWidget {
|
class ChattingItemPage extends StatelessWidget {
|
||||||
|
|
||||||
|
|
@ -22,10 +23,11 @@ class ChattingItemPage extends StatelessWidget {
|
||||||
child: TouchCallBack(
|
child: TouchCallBack(
|
||||||
onPressed: (){
|
onPressed: (){
|
||||||
Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext ctx){
|
Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext ctx){
|
||||||
return null;
|
return ChattingDetails(messageData: messageData,);
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
child: Row(
|
child: Row(
|
||||||
|
|
||||||
//垂直方 居中显示
|
//垂直方 居中显示
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
|
|
@ -34,8 +36,9 @@ class ChattingItemPage extends StatelessWidget {
|
||||||
// 头像左右留一定的外边距
|
// 头像左右留一定的外边距
|
||||||
margin: const EdgeInsets.only(left: 13.0, right: 13.0),
|
margin: const EdgeInsets.only(left: 13.0, right: 13.0),
|
||||||
child:
|
child:
|
||||||
Image.network(messageData.avatar, width: 48.0, height: 48.0),
|
Image.network(messageData.avatar, width: 35.0, height: 30.0),
|
||||||
),
|
),
|
||||||
|
SizedBox(width: 20),
|
||||||
Expanded(
|
Expanded(
|
||||||
//主标题和子标题采用垂直布局
|
//主标题和子标题采用垂直布局
|
||||||
child: Column(
|
child: Column(
|
||||||
|
|
@ -57,7 +60,7 @@ class ChattingItemPage extends StatelessWidget {
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
messageData.subTitle,
|
messageData.subTitle,
|
||||||
style: TextStyle(fontSize: 14.0, color: Color(0xffa9a9a9)),
|
style: TextStyle(fontSize: 16.0, color: Color(0xffa9a9a9)),
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
//显示不下的文本用省略号代替
|
//显示不下的文本用省略号代替
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:chatting/chatting_data_page.dart';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CurvedAnimation对象与SizeTransition类结合使用可以产生一个简单的动画效果。缓解效果会使消息在动画开始时快速滑动,并减慢速度直到停止。
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class ChatMessagePage extends StatefulWidget {
|
||||||
|
|
||||||
|
ChatMessagePage({this.text,this.animationController,this.messageData});
|
||||||
|
|
||||||
|
final MessageData messageData ;
|
||||||
|
|
||||||
|
final String text;
|
||||||
|
|
||||||
|
final AnimationController animationController;
|
||||||
|
|
||||||
|
@override
|
||||||
|
_ChatMessagePageState createState() => _ChatMessagePageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ChatMessagePageState extends State<ChatMessagePage> {
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
|
||||||
|
if(widget.messageData.title==null){
|
||||||
|
print("11");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return SizeTransition(
|
||||||
|
sizeFactor: CurvedAnimation(
|
||||||
|
parent: widget.animationController,
|
||||||
|
curve: Curves.easeOut
|
||||||
|
),
|
||||||
|
axisAlignment: 0.0,
|
||||||
|
child: cellContaint(context),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget cellContaint (BuildContext context){
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
margin: const EdgeInsets.symmetric(vertical: 10.0),
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
new Container(
|
||||||
|
margin: const EdgeInsets.only(right: 16.0),
|
||||||
|
child: new CircleAvatar(child: new Text(widget.messageData.title[0])),
|
||||||
|
),
|
||||||
|
new Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
new Text(widget.messageData.title, style: Theme.of(context).textTheme.subhead),
|
||||||
|
new Container(
|
||||||
|
margin: const EdgeInsets.only(top: 5.0),
|
||||||
|
child: new Text(widget.text),
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue