Commit fc9ce87f authored by 杜欣's avatar 杜欣

add message

parent d58738cd
...@@ -14,6 +14,7 @@ class MessageModel extends BaseModel { ...@@ -14,6 +14,7 @@ class MessageModel extends BaseModel {
LiveData<UnreadMessageEntity> likeUnreadMessageLive = new LiveData(); LiveData<UnreadMessageEntity> likeUnreadMessageLive = new LiveData();
LiveData<UnreadMessageEntity> followUnreadMessageLive = new LiveData(); LiveData<UnreadMessageEntity> followUnreadMessageLive = new LiveData();
LiveData<LatestMessageEntity> latestMessageLive = new LiveData(); LiveData<LatestMessageEntity> latestMessageLive = new LiveData();
MyMessageEntity myMessageList;
MessageModel(this.page, this.count); MessageModel(this.page, this.count);
...@@ -25,12 +26,18 @@ class MessageModel extends BaseModel { ...@@ -25,12 +26,18 @@ class MessageModel extends BaseModel {
} }
getMyMessage(page, count){ getMyMessage(page, count, [callback]){
MessageRepository.getInstance() MessageRepository.getInstance()
.getMyMessage(page, count) .getMyMessage(page, count)
.listen((value) { .listen((value) {
if (value != null) { if (value != null) {
myMessageLive.notifyView(value); if(page > 1) {
myMessageList.data?.addAll(value.data);
} else {
myMessageList = value;
}
if(callback != null) callback(value);
myMessageLive.notifyView(myMessageList);
} }
}).onError((error) { }).onError((error) {
Toast.show(error, "${error.toString()}"); Toast.show(error, "${error.toString()}");
......
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:gmalpha_flutter/NewMessageModel/page/MessageModel.dart'; import 'package:gmalpha_flutter/NewMessageModel/page/MessageModel.dart';
import 'package:gmalpha_flutter/NewMessageModel/page/common.dart';
import 'package:gmalpha_flutter/NewMessageModel/service/remote/entity/LatestMessageEntity.dart'; import 'package:gmalpha_flutter/NewMessageModel/service/remote/entity/LatestMessageEntity.dart';
import 'package:gmalpha_flutter/NewMessageModel/service/remote/entity/MyMessageEntity.dart'; import 'package:gmalpha_flutter/NewMessageModel/service/remote/entity/MyMessageEntity.dart';
import 'package:gmalpha_flutter/NewMessageModel/service/remote/entity/UnreadMessageEntity.dart'; import 'package:gmalpha_flutter/NewMessageModel/service/remote/entity/UnreadMessageEntity.dart';
import 'package:gmalpha_flutter/commonModel/ui/ALColors.dart'; import 'package:gmalpha_flutter/commonModel/ui/ALColors.dart';
import 'common.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
//刷新状态枚举
enum LoadingStatus {
//正在加载中
STATUS_LOADING,
//数据加载完毕
STATUS_COMPLETED,
//空闲状态
STATUS_IDEL
}
class MessagePage extends StatefulWidget { class MessagePage extends StatefulWidget {
MessageModel _messageModel; MessageModel _messageModel;
...@@ -29,19 +21,27 @@ class MessagePage extends StatefulWidget { ...@@ -29,19 +21,27 @@ class MessagePage extends StatefulWidget {
class _MessagePageState extends State<MessagePage> { class _MessagePageState extends State<MessagePage> {
MessageModel _messageModel; MessageModel _messageModel;
//限制一滑动到最下方就刷新,在刷新数据 及 刷新完之后改变状态
static var loadStatus = LoadingStatus.STATUS_IDEL;
static int pageCount = 10; static int pageCount = 10;
static int pageNo = 2;
RefreshController _refreshController = RefreshController(initialRefresh: false);
//定义整个页面的数据源 list _MessagePageState(this._messageModel);
static List list = new List(); @override
void initState() {
//定义加载中默认文字 super.initState();
String loadText = "加载中..."; _messageModel.init(context);
}
//定义 ListView 的监听, ScrollController ScrollController 能够添加对ListView的滑动监听 void _onLoading() async {
ScrollController _scrollController = new ScrollController(); await _messageModel.getMyMessage(pageNo, pageCount, (data) {
if(data.data?.length == 0) {
_refreshController.loadNoData();
} else {
pageNo++;
_refreshController.loadComplete();
}
});
}
Widget _pad(Widget widget, {l, t, r, b}) { Widget _pad(Widget widget, {l, t, r, b}) {
return new Padding( return new Padding(
...@@ -50,101 +50,94 @@ class _MessagePageState extends State<MessagePage> { ...@@ -50,101 +50,94 @@ class _MessagePageState extends State<MessagePage> {
child: widget); child: widget);
} }
// 加载中的布局 @override
Widget _loadingView() { Widget build(BuildContext context) {
var loadingTS = TextStyle(color: ALColors.Color999999, fontSize: 16); ScreenUtil.instance = ScreenUtil(width: 375, height: 667)..init(context);
// var loadingText=new Opacity(opacity: loadStatus==LoadingStatus.STATUS_LOADING?1.0:0,child:_pad(Text(loadText,style: loadingTS),l:20.0)); return Scaffold(
var loadingText = _pad(Text(loadText, style: loadingTS), l: 20.0); appBar: AppBar(
// var loadingIndicator=new Opacity(opacity: loadStatus==LoadingStatus.STATUS_LOADING?1.0:0,child:SizedBox(child: CircularProgressIndicator(valueColor: AlwaysStoppedAnimation(Colors.blue)),width: 20.0,height: 20.0,)); centerTitle: false,
var loadingIndicator = new Visibility( title: messageTitle('消息'),
visible: loadStatus == LoadingStatus.STATUS_LOADING ? true : false, elevation: 0,
backgroundColor: ALColors.ColorFFFFFF,
),
body: SmartRefresher(
enablePullDown: false,
enablePullUp: true,
footer: CustomFooter(
builder: (BuildContext context, LoadStatus mode){
String body;
var loadingTS = TextStyle(color: ALColors.Color999999, fontSize: ScreenUtil().setSp(16));
if(mode == LoadStatus.idle) {
body = '上拉加载';
} else if(mode == LoadStatus.loading || mode == LoadStatus.canLoading) {
body = '加载中...';
} else if(mode == LoadStatus.failed) {
body = '加载失败!点击重试!';
} else {
body = '暂时无更多数据';
}
var loadingIndicator = Visibility(
visible: (mode == LoadStatus.loading || mode == LoadStatus.canLoading) ? true : false,
child: SizedBox( child: SizedBox(
child: CircularProgressIndicator( child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation(ALColors.Color999999), valueColor: AlwaysStoppedAnimation(ALColors.Color999999),
strokeWidth: 2.0, strokeWidth: 2
), ),
width: 16.0, width: ScreenUtil().setWidth(16),
height: 16.0, height: ScreenUtil().setHeight(16)
)); )
);
return _pad( return _pad(
Row( Row(
children: <Widget>[loadingIndicator, loadingText], children: <Widget>[loadingIndicator, _pad(Text(body, style: loadingTS), l: ScreenUtil().setWidth(10))],
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
), ),
t: 20.0, t: 20.0,
b: 20.0); b: 20.0
} );
},
_MessagePageState(this._messageModel);
@override
void initState() {
super.initState();
_messageModel.init(context);
//在初始化状态的方法里 设置ListView的监听
_scrollController.addListener(() {
//判断 当滑动到最底部的时候,去加载更多的数据
if (_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
//此时加载下一页数据
_getMoreData();
}
});
}
@override
Widget build(BuildContext context) {
ScreenUtil.instance = ScreenUtil(width: 375, height: 667)..init(context);
return Scaffold(
appBar: AppBar(
centerTitle: false,
title: messageTitle('消息'),
elevation: 0,
), ),
body: SingleChildScrollView( controller: _refreshController,
child: Center( onLoading: _onLoading,
child: Container(
color: ALColors.ColorFFFFFF,
child: SingleChildScrollView(
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
topCard(), topCard(),
Container( getListView()
color: ALColors.ColorFFFFFF, ]
child: StreamBuilder<MyMessageEntity>( )
)
)
)
);
}
getListView() {
return StreamBuilder<MyMessageEntity>(
stream: _messageModel.myMessageLive.stream, stream: _messageModel.myMessageLive.stream,
initialData: _messageModel.myMessageLive.data , initialData: _messageModel.myMessageLive.data,
builder: (BuildContext context, data){ builder: (BuildContext context, data) {
var dataList = data.data?.data; var dataList = data?.data?.data;
if(dataList == null) { if(dataList == null) {
return Container( return noData();
color: ALColors.ColorFFFFFF,
height: ScreenUtil().setHeight(430),
child: Center(child: Text('暂无相关内容', style: TextStyle(color: ALColors.Color999999, fontSize: ScreenUtil().setSp(16))))
);
} }
print('++++++====================${dataList.length}=================');
return ListView.builder( return ListView.builder(
itemCount: dataList.length + 1, shrinkWrap: true,
itemExtent: 50, physics: NeverScrollableScrollPhysics(),
itemBuilder: (BuildContext context, int index) { itemBuilder: (c, i) => messageList(dataList[i]),
print('============${index}++++++++${dataList.length}============='); itemCount: dataList.length,
if (index == dataList.length) {
return _loadingView();
} else {
return messageList(dataList[index]);
}
},
controller: _scrollController,
); );
}, }
)
)
]
),
),
)
); );
} }
noData() {
return Container();
}
topCard(){ topCard(){
return Container( return Container(
color: ALColors.ColorFFFFFF, color: ALColors.ColorFFFFFF,
...@@ -154,27 +147,42 @@ class _MessagePageState extends State<MessagePage> { ...@@ -154,27 +147,42 @@ class _MessagePageState extends State<MessagePage> {
stream: _messageModel.latestMessageLive.stream, stream: _messageModel.latestMessageLive.stream,
initialData: _messageModel.latestMessageLive.data , initialData: _messageModel.latestMessageLive.data ,
builder: (BuildContext context, data){ builder: (BuildContext context, data){
if(data?.data == null) {
return noData();
}
var content = data.data?.data?.content ?? '没有新的通知'; var content = data.data?.data?.content ?? '没有新的通知';
print('-====================${data.data.data.content}================='); return GestureDetector(
return messageTop('images/message_noti.png', '通知', content == '' ? '没有新的通知' : content, 0); onTap: (){},
child: messageTop('images/message_noti.png', '通知', content == '' ? '没有新的通知' : content, 0)
);
}, },
), ),
StreamBuilder<UnreadMessageEntity>( StreamBuilder<UnreadMessageEntity>(
stream: _messageModel.likeUnreadMessageLive.stream, stream: _messageModel.likeUnreadMessageLive.stream,
initialData: _messageModel.likeUnreadMessageLive.data , initialData: _messageModel.likeUnreadMessageLive.data ,
builder: (BuildContext context, data){ builder: (BuildContext context, data){
if(data?.data == null) {
return noData();
}
var voteCount = data.data?.data?.voteCount ?? 0; var voteCount = data.data?.data?.voteCount ?? 0;
print('-====================${voteCount}================='); return GestureDetector(
return messageTop('images/message_like.png', 'Like!', voteCount == 0 ? '还没有人给你Like!哦~' : '有$voteCount个人Like!了你', voteCount); onTap: (){},
child: messageTop('images/message_like.png', 'Like!', voteCount == 0 ? '还没有人给你Like!哦~' : '有$voteCount个人Like!了你', voteCount)
);
}, },
), ),
StreamBuilder<UnreadMessageEntity>( StreamBuilder<UnreadMessageEntity>(
stream: _messageModel.followUnreadMessageLive.stream, stream: _messageModel.followUnreadMessageLive.stream,
initialData: _messageModel.followUnreadMessageLive.data , initialData: _messageModel.followUnreadMessageLive.data ,
builder: (BuildContext context, data){ builder: (BuildContext context, data){
if(data?.data == null) {
return noData();
}
var count = data.data?.data?.count ?? 0; var count = data.data?.data?.count ?? 0;
print('-====================${count}================='); return GestureDetector(
return messageTop('images/message_att.png', '关注', count == 0 ? '还没有人给你关注哦~' : '有$count个人关注了你', count); onTap: (){},
child: messageTop('images/message_att.png', '关注', count == 0 ? '还没有人给你关注哦~' : '有$count个人关注了你', count)
);
}, },
), ),
Container( Container(
...@@ -196,34 +204,11 @@ class _MessagePageState extends State<MessagePage> { ...@@ -196,34 +204,11 @@ class _MessagePageState extends State<MessagePage> {
); );
} }
//获取完更多数据,然后给控件setState 让控件进行数据更新
Future _getMoreData() async {
if (loadStatus == LoadingStatus.STATUS_IDEL)
//先设置状态,防止往下拉就直接加载数据
setState(() {
loadStatus = LoadingStatus.STATUS_LOADING;
});
List moreList = [1,2];
await _messageModel.getMyMessage(2, 2);
//准备完数据后,在设置状态
setState(() {
if (moreList.length > 0) {
list.addAll(moreList);
loadStatus = LoadingStatus.STATUS_IDEL;
loadText = '加载中...';
} else {
//加载完毕
loadText = '暂时无更多数据';
loadStatus = LoadingStatus.STATUS_COMPLETED;
}
});
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
_scrollController.dispose(); _refreshController.dispose();
pageNo = 2;
} }
} }
\ No newline at end of file
...@@ -151,7 +151,9 @@ messageList(list) { ...@@ -151,7 +151,9 @@ messageList(list) {
) )
], ],
), ),
Text( Container(
width: ScreenUtil().setWidth(210),
child: Text(
list.content, list.content,
style: TextStyle( style: TextStyle(
color: ALColors.Color323232, color: ALColors.Color323232,
...@@ -160,12 +162,10 @@ messageList(list) { ...@@ -160,12 +162,10 @@ messageList(list) {
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis overflow: TextOverflow.ellipsis
), ),
),
Text( Text(
// TimelineUtil.format(list.time, dataFormat(list.time),
// locTimeMillis: DateTime.now().millisecondsSinceEpoch, // list.time.toString(),
// locale: 'zh',
// dayFormat: DayFormat.Full),
list.time.toString(),
style: TextStyle( style: TextStyle(
color: Color(0xfff8e8e8e), color: Color(0xfff8e8e8e),
fontSize: ScreenUtil().setSp(10) fontSize: ScreenUtil().setSp(10)
...@@ -185,3 +185,10 @@ messageList(list) { ...@@ -185,3 +185,10 @@ messageList(list) {
) )
); );
} }
dataFormat(timestamp) {
return TimelineUtil.format((timestamp * 1000).toInt(),
locTimeMillis: DateTime.now().millisecondsSinceEpoch,
locale: 'zh',
dayFormat: DayFormat.Full);
}
...@@ -45,12 +45,13 @@ class TestPage extends StatelessWidget { ...@@ -45,12 +45,13 @@ class TestPage extends StatelessWidget {
} }
testMessagePage(BuildContext context) { testMessagePage(BuildContext context) {
return base( return base(context, () {
Navigator.push(
context, context,
RouterCenterImpl() new CustomRoute(RouterCenterImpl()
.findNewMessageRouter() .findNewMessageRouter()
?.getMessagePage(''), ?.getMessagePage('')));
"消息页面"); }, "消息页面");
} }
testReportPage(BuildContext context) { testReportPage(BuildContext context) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment